Listen vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

hallo python Gemeinde,

habe folgendes Problem:

liste 1 ist vorgegeben
liste 2 wird nach und nach mit Zufallszahlen aufgefüllt

bei jedem neuen Eintrag wird liste 2 mit vorgegebener Liste 1 verglichen, ob das Ergebnis gleich ist oder nicht.
Wenn ja, soll 1 ausgegeben werden, wenn nicht, 0

Beispiel:

liste1 = [ 3,1,4 2,4,3,2,2,3 ]

liste2 = [ 1 ]
Ausgabe = 0

liste2 = [ 1,1, ]
Ausgabe = 0,1

liste2 = [ 1,1,2 ]
Ausgabe = 0,1,0

usw., bis die Anzahl der Einträge von liste 1 erreicht ist

funktionert das vieleicht mit einem Zähler? sollte ich die Ergebnisse in eine dritte Liste packen?

wäre sehr dankbar für Hilfe ...
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@haeuslermartin,

dafür eignet sich zip() sehr gut.

zum Beispiel:

Code: Alles auswählen

for element1, element2 in zip(liste1, liste2):
    if element1 == element2:
        ...
zip() bildet einen Iterator aus Tupeln von jeweils benachbarten Listenelementen die man direkt in zwei getrennte Variablen (element1 und element2) entpacken kann.
Sind die Listen unterschiedlich lang, wird aufgehört sobald eins der Listenenden erreicht ist.


Oder mit einer ListComprehension, einer etwas kompaktere Form der For-Schleife um die Ergebnisse gleich in einer Liste "ergebnisse" zu speichern.

Code: Alles auswählen

ergebnisse = [
    "1" if element1==element2
    else "0" 
    for element1, element2 
    in zip(liste1, liste2)
]
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@haeuslermartin: Zähler nicht solange der nicht wirklich notwendig wäre, und ich sehe nicht wo der hier notwendig wäre:

Code: Alles auswählen

#!/usr/bin/env python3
from random import randint


def main():
    given_numbers = [3, 1, 4, 2, 4, 3, 2, 2, 3]
    random_numbers = []
    results = []
    for given_number in given_numbers:
        random_number = randint(1, 6)
        random_numbers.append(random_number)
        results.append(int(random_number == given_number))
        print(*results, sep=",")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

rogerb hat geschrieben: Montag 23. August 2021, 22:53 Oder mit einer ListComprehension, einer etwas kompaktere Form der For-Schleife um die Ergebnisse gleich in einer Liste "ergebnisse" zu speichern.

Code: Alles auswählen

ergebnisse = [
    "1" if element1==element2
    else "0" 
    for element1, element2 
    in zip(liste1, liste2)
]
Dann aber gleich die richtig kompakte Form.

Code: Alles auswählen

ergebnisse = [element1 == element2 for element1, element2 in zip(liste1, liste2)]
Als gewünschte Ergebniswerte für die Listenelemente waren 1 und 0 angegeben. Mit `element1 == element2` bekommst du ein Boolean. Da `bool` eine Unterklasse von `int` ist werden True und False wie 1 und 0 behandelt.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Mit `element1 == element2` bekommst du ein Boolean
Ja, dann hat man eine Liste von boolean und nicht Einsen und Nullen. Man kann auch wie __blackjack__ in ein int konvertieren. Es gibt viele Möglichkeiten, je nachdem was man Ende haben möchte.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei solchen Aufgaben stellt sich zuerst die Frage, was soll geübt werden, also welches Thema wurde gerade behandelt. Da haeuslermartin diesen Kontext nicht mitgeliefert hat, sind die Antworten mehr oder minder hilfreich.
Soll hier das iterieren über eine Liste und das komplexere Verarbeiten in einer for-Schleife geübt werden, wie es __blackjack__s Lösung zeigt, oder soll hier das iterieren über mehrere Listen gleichzeitig mit einfacher Operation geübt werden, wie rogerbs Antwort?
Ist es wichtig, ein zur Weiterverarbeitung sinnvolles Ergebnis zu haben wie /mes Lösung, oder geht es mehr darum, exakt die Ausgabe zu reproduzieren?
Wir wissen das alles nicht.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

rogerb hat geschrieben: Dienstag 24. August 2021, 08:00 Ja, dann hat man eine Liste von boolean und nicht Einsen und Nullen.
Ein Boolean ist ein Integer! Das lässt sich mit `isinstance(True, int)` leicht überprüfen. True entspricht der 1 und False der 0, so dass Dinge wie `(True + True) * 21` problemlos möglich sind.

Prinzipiell hat Sirius3 aber natürlich recht. Die Aufgabenstellung macht nicht klar, was genau gewünscht ist. Vielleicht ist es ja auch eine Hausaufgabe, die aus irgendwelchen obskuren Gründen einen Indexzugriff erwartet, so dass man z.B. mit `for in in range(min(len(liste1), len(liste2))):` arbeiten müsste.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ein Boolean ist ein Integer!
Ich weiß! Die Darstellung ist aber unterschiedlich. Ich verstehe allerdings auch nicht worauf du hinaus willst. Ich wollte halt "1" und "0" in meinem Beispiel ausgeben.
Es ging darum zu zeigen wie man elementweise über zwei Listen iterieren kann, ohne einen Zähler zu verwenden. Ich hätte die Ziffern auch in kleine Herzchen einbetten können um es etwas ansprechender zu gestallten...
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

danke erstmal, hab gerade viel um die Ohren, und muß mich dann eingehend mit Euren Antworten beschäftigen. zur Info, ich bin kein Schüler oder Student und will auch kein Pythonexperte mehr werden mit meinen 70 Jahren, mich interessieren Zufallsaspekte und da schreib ich mir halt ab und zu kleine Anwendungen, die nur in der IDLE laufen.
Aber nochmals vielen Dank für die Antworten!
Antworten