2017-09-06 2 views
2

Ich habe eine Rota der Mitarbeiter und eine Liste der Mitarbeiterdetails. Wie füge ich den Nachnamen in die Rota ein?So aktualisieren Sie eine Liste von Listen mit Details in einer anderen Liste von Listen gefunden

Die tatsächliche Rota hat mehrere hundert Einträge mit vielen Wiederholungen der gleichen Person (aber alle Mitarbeiter haben einen anderen Namen), und die Detailliste hat etwa 100 Einträge und möglicherweise nicht ein oder zwei der Mitarbeiter auf ihm.

Der unten stehende Code funktioniert, durchläuft jedoch alle Details für jeden Rota-Eintrag. Gibt es einen effizienteren Weg (mit Python 2.7) und kann ich "?" wenn der Name nicht gefunden wird?

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']] 
details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']] 

for eachName in rota: 
    for eachEmployee in details: 
     if eachName[0] == eachEmployee[0]: 
      eachName.append(eachEmployee[1]) 

print rota 

(Sorry, wenn dies verwirrend ist, ist es das einfachste Beispiel könnte ich mir vorstellen!)

Antwort

2

Sie einfach details zu einem dict konvertieren müssen:

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']] 
details = dict([['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']]) 

for eachName in rota: 
    surname = details.get(eachName[0]) 
    if surname: 
     eachName.append(surname) 

print(rota) 

Beachten Sie, dass es nur eine for Schleife nach links, und die Verarbeitung sollte viel schneller sein.

Die Werte in Ihrem dict könnte Tupeln mit mehreren Attributen sein:

>>> details = dict([['Paul', ('Smith', 32)], ['Simon', ('Says', 20)], ['Steve', ('Brown', 52)]]) 
>>> details 
{'Steve': ('Brown', 52), 'Paul': ('Smith', 32), 'Simon': ('Says', 20)} 
+0

Brilliant! Leider habe ich mein Beispiel zu sehr vereinfacht, da es mehr als nur zwei Details für jeden Mitarbeiter gibt, aber es muss einfach genug sein, um die Liste mit den zwei Details zu duplizieren, die ich brauche. Vielen Dank. – Phil

0

Sie effizient diese mit Liste und Wörterbuch Comprehensions tun können, mit einem Vorbehalt - alle Schlüssel in beiden Listen sein muss. Beachten Sie, dass die Schlüsselübereinstimmung von "Bob" aus Ihrem ursprünglichen Code auskommentiert wurde.

>>> rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon']] #, ['Bob']] 
>>> details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']] 
>>> d = {n[0]: n[1] for n in details} 
>>> [list([n[0],d[n[0]]]) for n in rota] 
[['Paul', 'Smith'], ['Paul', 'Smith'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Simon', 'Says']] 
>>> 
+0

Haben Sie Ihren Code getestet? –

+0

Huch! Dies funktioniert nicht, wenn ein Schlüsselfehler vorliegt. Danke für die Rückmeldung. –

Verwandte Themen