Frage von DatAnswerFromMe, 82

Python: Wie lese ich gleiche Werte aus einer Liste ab?

Meine Liste enthält die Lektionen von Schulvokabeln, die man abgefragt hat.

Ich möchte gerne dem Benutzer des Programms auflisten, von welcher Lektion er wie viel abgefragt hat.

Meine Liste sieht also etwa so aus: list = ["1", "1", "1", "3", "3", "5"]

Ich möchte dem Benutzer damit so ein Text schicken: 50% Lektion 1 33% Lektion 3 17% Lektion 2

Antwort
von karajan9, 36

Ich klaue mal gerade den Code von http://stackoverflow.com/questions/2600191/how-can-i-count-the-occurrences-of-a-... :

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

Viele Probleme wurden schon mal gelöst ;-)

Kommentar von DatAnswerFromMe ,

Ist das ein Json Format? Damit kenne ich mich noch nicht ganz aus.

Kommentar von karajan9 ,

Das 

{'blue': 3, 'red': 2, 'yellow': 1}

nennt sich in Python Dictionary, dazu gibt es eine gute Menge Dokumentation :-)

Kommentar von DatAnswerFromMe ,

Es wäre gut, wenn ich es so umwandeln könnte:

Blue: 3

Red: 2

Yellow: 1

Kommentar von karajan9 ,
Kommentar von DatAnswerFromMe ,

Ich bin ganz neu in Python und kenne mich noch nicht so aus.

Kommentar von karajan9 ,

Nicht schlimm, das sind auch nicht mehr die Basics. Wenn du möchtest, kannst du ja auch etwas eigenes für das Problem schreiben, dann hast dus quasi ein Mal selbst gemacht.

Ich glaube nur viele von deinen Problemen lassen sich durch googlen ziemlich schnell herausfinden -- so lernst du dann auch mehr, als wenn du die richtige Lösung quasi "vorgesagt" bekommst :-)

Kommentar von DatAnswerFromMe ,

Du willst wohl echt nicht mit der Lösung rausrücken xD Ist gut so, bin gerade so demotiviert aber will das noch kurz machen (lassen! :D)

Naja ich danke dir für das, was du mir schon gesagt hast. Hat mir aufjedenfall schon weitergeholfen.

Kommentar von karajan9 ,

Welche Lösung meinst du? Mit den Sachen, die ich dir gesagt habe müsste das doch inzwischen klappen, oder?

Wenn du willst, kann ich dir auch noch einen Algorithmus zum selbstprogrammieren sagen -- kommt halt drauf an, was du willst oder dir davon versprichst.

Kommentar von DatAnswerFromMe ,

Ich weiß nicht was iterieren heißt: Aber ich möchte dieses Format haben:

Blue: 3

Yellow: 2

Pink: 1

Kommentar von karajan9 ,

Iterieren heißt mit einer Schleife jedes Element durchgehen.

Magst du mir mal sagen, was allgemein deine Programmierkenntnisse sind, dann ist es vielleicht leichter dir zu helfen.

Kommentar von DatAnswerFromMe ,

Ich habe jetzt mit dem Counter Objekt die Werte und die Anzahl wie oft diese Werte in der Liste vorkommen.

Ich möchte jetzt mit einer Schleife die Werte und die Anzahl durchgehen. Wie mache ich das?

Beispiel:

for verschiedenewerte in liste

    verschiedenewerte.anzahl

Kommentar von karajan9 ,
for lektion in liste: # <-- hier den Doppelpunkt nicht vergessen
    anzahl = liste[lektion]

So müsstest du Zugriff sowohl auf die Lektion als auch die passende Anzahl haben. Ich hoffe, das klappt so.

Kommentar von DatAnswerFromMe ,

Diese Schleife ist das einzige, was ich zur Umsetzung meiner Idee brauche.

for verschiedenewerte in liste

        print("Du hast Lektion " + verschiedenewerte.lektion + " " +       verschiedenewerte.wert + " mal abgefragt!")

Kommentar von karajan9 ,

Na, mein vorheriger Kommentar müsste den Trick doch tun, oder?

Kommentar von DatAnswerFromMe ,

Deine Schleife hat eine Fehlermeldung hervorgehoben.

Ich möchte doch nur die Counter Methode haben, aber sie irgendwie als Liste durchgehen :/

Kommentar von karajan9 ,

Wenn du mir den Fehler auch sagst, kann ich dir vielleicht sogar helfen. Wichtig ist, dass "liste" der Counter ist, oder eben

counter = Counter(liste)
for lektion in counter:
    ...
Kommentar von DatAnswerFromMe ,

Mit deiner Methode kann ich schon mal sehr schön die Werte auslesen. Aber wie kriege ich jetzt noch raus wie oft diese Werte vorkommen? :)

PS: Du hast gleich deine beste Antwort ^^

Kommentar von karajan9 ,

Na, wie gesagt:

counter = Counter(liste)
for lektion in counter: # <-- hier den Doppelpunkt nicht vergessen
    anzahl = counter[lektion]
    print("Du hast Lektion", lektion, anzahl, "Mal abgefragt!")
Kommentar von DatAnswerFromMe ,

Die Werte werden in der falschen Reihenfolge durchgegangen.

Kommentar von karajan9 ,
counter = Counter(liste)
for lektion in sorted(counter):
anzahl = counter[lektion]
print("Du hast Lektion", lektion, anzahl, "Mal abgefragt!")
Kommentar von DatAnswerFromMe ,

Letztes Anliegen:
Ich möchte nicht nach Lektionsnamen sortieren, sondern nach Anzahl wie oft ich diese abgefragt habe.

Kommentar von karajan9 ,
counter = Counter(liste) for lektion, anzahl in counter.most_common():
print("Du hast", lektion, anzahl, "Mal abgefragt")

Als Erklärung dazu: In Python kann eine Funktion mehrere Werte zurück geben, die sind dann in Tupeln organisiert. Das sie dann so aus

("Lektion1", 5)

An die enzelnen Werte kommst du dran, in dem du jedem einer Variable zuweist, also:

lektion, anzahl = ("Lektion1", 5)

Genau das passiert im Kopf der Schleife, daher kannst du direkt auf den Namen der Lektion und die entsprechende Anzahl zugreifen -- weil die Funktion most_common() das so zurückgibt.

Kommentar von DatAnswerFromMe ,

Danke für deine Großzügige Hilfe. Jetzt funktioniert alles perfekt! :)

Kommentar von DatAnswerFromMe ,

Jetzt kann der NUtzer von dem Vokabelübersetzer in bester Reihenfolge angeordnet sehen, welche Vokabeln er abgefragt hat und welche Lektionen er nicht wusste, damit er sie lernen kann :)

Kommentar von DatAnswerFromMe ,

Es muss also immer nur einmal der Wert durchgegangen werden.. Nicht alle Werte in der Liste, sondern nur immer einmal für alle male, die der gleiche Wert da ist.

Keine passende Antwort gefunden?

Fragen Sie die Community