Tabbellen 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
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

ich will 2 Tabellen vergleichen, allerdings Im Tabellensatz soll er nur den 1. Eintrag vergleichen.

Code: Alles auswählen

liste1=[("Andreas","20"),("Clea","22"),("Anissa","45"),("Thomas","41")]
liste2=[("Bea","34"),("Clea","25"),("Anika","43")]

for z,list2 in enumerate(liste2[0]):
    print(liste2[z][0])    
    if any(liste2[z][0] in sublist for sublist in liste1[0]):
        print("ja")
    else:
        li=(liste2[z])
        print(li)            
        liste1.append((li))

for z,i in enumerate(liste1):
    print(str(z+1)+": "+i[0]+" - "+i[1])
so gehts nicht.

So sollte das ergebis sein:
liste1=[("Andreas","20"),("Clea","22"),("Anissa","45"),("Thomas","41"),("Bea","34"),("Anika","43")]

also ("Clea","25") sollte weil eintrag1 "Clea" vorhanden nicht in Liste1 geadden werden.
was mache ich falsch, irgenwie bei so einem simplen problem komme ich nicht weiter.
Ohne "tuple" in der "list" gehts, aber mit Tuple nicht
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Für das Beispiel gibt es doch mit dem dict eine viel passendere Datenstruktur. Deren Funktionalität versuchst du hier gerade irgendwie nachzubauen.

Code: Alles auswählen

persons_to_age = {"Andreas": 20, "Clea": 22, "Anissa": 45, "Thomas": 41}
other_persons_to_age = {"Bea": 34, "Clea": 25, "Anika": 43}

for other_person, age in other_persons_to_age.items():
    if other_person not in persons_to_age:
        persons_to_age[other_person] = age

print(persons_to_age)
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

ich habe 2 Tabellen mit 3 Spalte(name, Alter, größe). (Pyqt5 Tabellen)
die will ich miteinenander vergleichen aber nur der 1. Eintrag(name) ist entscheidend, die anderen sind nur zusäztliche Informationen

ich habe das mit dem Tuple, list nur anders dargestellt zum besseren testen.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Dem dict ist es egal, ob als Wert ein einziger Wert oder eine Liste enthalten ist.
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

ich müsste so aber von tabelle in dict umwandeln und zurück oder gibts da ein trick ?
Tabelle sähe halt wie tuple, list aus

Code: Alles auswählen

Liste1={};Liste2={}
liste1=[("Andreas","20"),("Clea","22"),("Anissa","45"),("Thomas","41")]
liste2=[("Bea","34"),("Clea","25"),("Anika","43")]
for z in range(len(liste1)):
    Liste1.update({liste1[z][0]:liste1[z][1]})
for z in range(len(liste2)):
    Liste2.update({liste2[z][0]:liste2[z][1]})
#Liste1 = {"Andreas": 20, "Clea": 22, "Anissa": 45, "Thomas": 41}
##Liste2 = {"Bea": 34, "Clea": 25, "Anika": 43}

for other_person, age in Liste2.items():
    if other_person not in Liste1:
        liste1.append((other_person,age))

print(liste1)
ich habs jetzt so geändert.
Danke für deine Hilfe !!!
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Code: Alles auswählen

        tblAKA={};tblINTAKA={}
        for reihe in range(self.tblAKA.rowCount()):
            tblAKA.update({self.tblAKA.item(reihe, 0).text():(self.tblAKA.item(reihe, 1).text(),self.tblAKA.item(reihe, 2).text())})
        for reihe in range(self.tbl_INTAKA.rowCount() ):
            tblINTAKA.update({self.tbl_INTAKA.item(reihe, 0).text():(self.tbl_INTAKA.item(reihe, 1).text(),self.tbl_INTAKA.item(reihe, 2).text())})
        for name, art_land in tblINTAKA.items():
            if name not in tblAKA:
                neue_Zeile=self.tblAKA.rowCount()+1
                self.tblAKA.setRowCount(neue_Zeile)
                self.tblAKA.setItem(neue_Zeile-1, 0,QtWidgets.QTableWidgetItem(name))                
                self.tblAKA.setItem(neue_Zeile-1, 1,QtWidgets.QTableWidgetItem(art_land[0]))
                self.tblAKA.setItem(neue_Zeile-1, 2,QtWidgets.QTableWidgetItem(art_land[1]))
Das ist der Code finally :)

das klappt so 1a
Dank dir nochmals !
Benutzeravatar
Max07t
User
Beiträge: 6
Registriert: Montag 21. Juni 2021, 15:23
Wohnort: Frankfurt am Main
Kontaktdaten:

Ich habe das Problem wie folgt gelöst:

Code: Alles auswählen

liste1 = [("Andreas","20"),("Clea","22"),("Anissa","45"),("Thomas","41")]
liste2 = [("Bea","34"),("Clea","25"),("Anika","43")]

for i in liste2:
    if i[0] not in [name[0] for name in liste1]:
        liste1.append(i)
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

jo klapt auch, wäre sogar die einfachste Lösung.
"not in [name[0]" <-- wäre ich wohl nicht draufgekommen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

`;` verwendet man nicht, sondern schreibt jede Anweisung in eine neue Zeile, um den Code lesbarer zu halten. Man benutzt nicht update um einen einzelnen Wert eines Wörterbuchs zu setzen.
Man benutzt keine Abkürzungen in Variablennamen, weil sie das lesen sehr erschwert. tbl weiß ich, dass es eigentlich table heißen sollte, AKA und INTAKA sind für mich Rätsel und Rätsel möchte man beim Programmieren nicht lösen.
In `tblAKA` brauchst Du doch gar nicht alle Informationen, sondern nur die Namen und dafür ist ein Set ausreichend.
Und das zweite Wörterbuch brauchst Du gar nicht, weil Du gleich die Tabelle erweitern kannst.

Code: Alles auswählen

        names = set(
            self.tblAKA.item(reihe, 0).text()
            for reihe in range(self.tblAKA.rowCount())
        )
        neue_Zeile = self.tblAKA.rowCount()
        for reihe in range(self.tbl_INTAKA.rowCount()):
            name = self.tbl_INTAKA.item(reihe, 0).text()
            if name not in names:
                art = self.tbl_INTAKA.item(reihe, 1).text()
                land = self.tbl_INTAKA.item(reihe, 2).text()
                self.tblAKA.setRowCount(neue_zeile + 1)
                self.tblAKA.setItem(neue_zeile, 0, QtWidgets.QTableWidgetItem(name))                
                self.tblAKA.setItem(neue_zeile, 1, QtWidgets.QTableWidgetItem(art))
                self.tblAKA.setItem(neue_zeile, 2, QtWidgets.QTableWidgetItem(land))
                neue_zeile += 1
Antworten