Inhalte von 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
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

ich möchte den Inhalt einer Liste mit dem Inhalt einer anderen Liste vergleichen.

Code: Alles auswählen

liste1 = [[1, 2], [3, 4], [5, 6]]
liste2 = [2, 1]

if liste[0] in (lambda x: x for x in liste1):
    print 'Ja'

Ich könnte auch über die liste1 iterieren, doch geht das nicht irgendwie so auch einfacher ?

gruß frank
BlackJack

Du wirst wohl nochmal genauer beschreiben müssen was Du machen möchtest. Weder aus der Beschreibung noch aus dem Quelltext werde ich schlau.

Zum Quelltext: `liste` wird nicht definiert und ein ``in`` auf eine Funktion angewendet ergibt einen `TypeError`.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Ich weiß nicht ob du das meinst:

Code: Alles auswählen

liste1 = [[1, 2], [3, 4], [5, 6]]
liste2 = [2, 1]

liste2 in liste1

False

liste1 = [[1, 2], [3, 4], [5, 6]]
liste2 = [1, 2]

liste2 in liste1

True
mfg

Thomas :-)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack !

Code: Alles auswählen

if liste2[0] in ....
Ob ein Element der Liste2 in den Einzellisten der Liste1 ist.

gruß frank
BlackJack

Nur das erste Element von `liste2`? Alle? Irgend eins?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Mal eine Version mit einer Schleife über die Liste1.

Code: Alles auswählen

liste1 = [[1, 2], [3, 4], [5, 6]]
liste2 = [1, 2]
for element in liste1:
    if liste2[0] in element:
        print 'Ja'
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Habe mir noch einige Gedanken gemacht und habe es mal die Funktion mit lambda ausgelagert.

Code: Alles auswählen

if liste2 in liste1:
    print 'ja'
else:
    print 'Nein'

ja
Das funktioniert natürlich, da ich Äpfel mit Äpfel vergleiche !

Code: Alles auswählen

if liste2[0] in liste1:
	print 'ja'
else:
	print 'Nein'

Nein
So würde ich gerne vergleichen, doch jetzt habe ich Äpfel und Birnen !

Code: Alles auswählen

def vergleiche(liste1):
    for element in liste1:
        return element

if liste2[0] in vergleiche(liste1):
	print 'ja'
else:
	print 'Nein'

ja
Diese funktion hätte ich gerne mit lambda gemacht - bekomme ich aber nicht so hin ?!

gruß frank
BlackJack

Immer wenn ich denke ich hab's verstanden verwirrst Du mich wieder mit Quelltext.

Dein letztes Beispiel mit `vergleiche()` ist eine sehr umständliche Art ``if liste2[0] in liste1[0]:`` zu sagen. Ist dir das klar!?

Ich weiss auch nicht warum Du ein ``lambda`` haben willst!?

Die verschachtelten Schleifen aus dem vorletzten Beitrag könnte man auch so ausdrücken:

Code: Alles auswählen

if any(liste2[0] in sublist for sublist in liste1):
    print 'ja'
else:
    print 'nein'
Nicht_zu_definieren
User
Beiträge: 21
Registriert: Freitag 21. April 2006, 17:01
Kontaktdaten:

Ich vermute, dass dich das hier relativ nahe an das heranbringt was du suchst. Es bleibt jedoch bei einer Vermutung weil aus dem was du schreibst nicht ganz klar wird was du eigentlich willst :?

Code: Alles auswählen

>>>liste1 = [[1,2,3], [3,4], range(5)]
>>>liste2 = [3,1,2]

>>>spam = lambda list1, set2: True in [True for elem in list1 if set(elem)==set2]

>>>spam(list1, set(liste2))
True

>>>liste1 = [[1,1,1,1,1,2,2,2,2,2,2,1,1,1]]
>>>liste2 = [2,1]
>>>spam(liste1, set(liste2))
True


Edit: Ja, mit any() geht es auch.

Code: Alles auswählen

spam = lambda list1, set2: any([True for elem in list1 if set(elem)==set2])
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke BlackJack !

Ich wollte dich nicht verwirren - Ich denke nicht wie ein Informatiker - da gibt es glaub ich ein gutes Tut. in Netz. :oops:

Das was du mit 'any' machst, habe ich ja mit der funktion 'vergleiche(liste1):' ja auch gemacht - oder ?

Ich hatte gedacht solch einen Vergleich ohne Funktion macht man mit einen lambda-Funktion. So geht es auch.

gruß und dank frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo Nicht_zu_definieren !

Was ich machen möchte ist mir schon klar. Wie ich es aber formuliere war mir nicht so ganz klar.

gruß und dank frank
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

kaytec hat geschrieben:Das was du mit 'any' machst, habe ich ja mit der funktion 'vergleiche(liste1):' ja auch gemacht - oder ?
Nein, deine Funktion `vergleiche' ist, wie BlackJack bereits sagte, einfach nur eine umständliche Art ``liste1[0]'' zu sagen, weil deine Funktion einfach nur immer das erste Element der übergebenen Liste zurückgibt. Mit dem ``return element'' wird die Funktion verlassen. Für immer. Und selbst wenn sie so funktionieren würde, wie du vermutlich gedacht hast, wäre das ja nicht anderes als eine Iteration über eine Liste.

Deine `vergleiche' müsste so irgendwie aussehen, damit sie funktioniert:

Code: Alles auswählen

def vergleiche(liste1):
    for element in liste1:
        for subelement in element:
            yield subelement
BlackJack

Wie schon gesagt: Dein ``vergleiche(liste1)`` ist vom Effekt das gleiche wie ``liste1[0]``. Die Funktion gibt einfach nur das erste Element der Liste zurück.

Edit: Mist, zu langsam. :-)

Dann ist der Name `vergleiche` natürlich sehr irreführend, weil da ja nichts verglichen wird.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke an Alle !

ich hatte gedacht bei meiner 'vergleiche' Funktion, die ja nicht wirklich vergleicht, würde die return Anweisung alle Unterlisten zurückgeben.

Mit 'any' geht es ja super !

gruß frank
Antworten