2017-09-08 3 views
0

Ich habe diese 2 Liste der Listen:basierend auf Index

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]] 

list2 = [['A', 14, 'Y', 0, 200], ['B', 15, 'M', 0, 400], ['C', 17, 'G', 0, 600]] 

(dies ist nur ein Beispiel mit nur drei Listen, habe ich mehr Listen, aber sie sind auf dem exakt gleichen Format und gelten dieselben Regeln)

und dies wird mein Wunsch ausgegeben werden:

finalList = [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60],['C', 17, 'G', 0, 600]] 

das ist die Regel, wie ich berechnen finalList:

Wenn list1[listindex][1] == list2[listindex][1] (Bsp .: wenn 14 == 14), ersetzen in list1 -> list2[2] und list2[4] (ex: 'Y' und 200) und wenn nicht einfach die Liste von Liste2 zu Liste1 hinzufügen, wie es ist (wie in meiner gewünschten Ausgabe) und behalten Sie auch diejenigen, die in list1 sind, die nicht übereinstimmen (ex: ['C', 16, 'F', 50, 60]). Wie kann ich dies in einer Python 3-Funktion tun? Ich hätte gerne eine einfache und unkomplizierte Funktion dafür. Vielen Dank für Ihre Zeit!

+0

Haben Sie etwas versucht? Können Sie uns zeigen, was Sie getan haben? – Arount

Antwort

1

Sie alle Ihre Regeln gelten können if Anweisungen in einer Funktion.

def custom_merge(list1, list2): 
    finalList = [] 
    for sub1, sub2 in zip(list1, list2): 
     if sub1[1]==sub2[1]: 
      out = sub1.copy() 
      out[2] = sub2[2] 
      out[4] = sub2[4] 
      finalList.append(out) 
     else: 
      finalList.append(sub1) 
      finalList.append(sub2) 
    return finalList 
+0

Danke, Sir, das ist genau das, was ich brauche! – Rommel

0

Hier ist eine Möglichkeit, es zu tun, um ein Liste Verständnis mit:

lst = [i for x, y in zip(list1, list2) 
      for i in (([*x[:2], y[2], x[3], y[4]],) if x[1] == y[1] else (x, y))] 

print(lst) 
# [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60], ['C', 17, 'G', 0, 600]] 

Der Aufbau der inneren Liste für die Zuordnung Fall macht es leicht lesbar. Es wäre viel lesbar in einem ‚deflattened‘ Form mit einem für Schleife:

def merge_lists(list1, list2): 
    lst = [] 
    for x, y in zip(list1, list2): 
     if x[1] == y[1]: 
      lst.append([*x[:2], y[2], x[3], y[4]]) 
     else: 
      lst.extend((x, y)) 
    return lst 
0

Für Arbeiten an den beiden Listen gleichzeitig können Sie zip()Docs Here

Zum Beispiel verwenden:

for value in zip(list1, list2): 
     print (value[0], value[1]) 

zurückkehren wird:

['A', 14, 'I', 10, 20] ['A', 14, 'Y', 0, 200] 
['B', 15, 'S', 30, 40] ['B', 15, 'M', 0, 400] 
['C', 16, 'F', 50, 60] ['C', 17, 'G', 0, 600] 

so mit Reißverschluss Sie können arbeiten beide deine Listen gleichzeitig.

+0

Danke für den Tipp! – Rommel

0

Hier ist ein Ansatz, der die Listen in eine dict umwandelt und nutzt die Tatsache, dass sich überlappende Elemente aus list2 wird nur überschreiben ihre list1 Pendants:

combined_list = list1 + list2 
final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list} 
> {('A', 14): ('Y', 0, 200), 
    ('B', 15): ('M', 0, 400), 
    ('C', 16): ('F', 50, 60), 
    ('C', 17): ('G', 0, 600)} 
merged_list = [list(k) + list (final_dict[k]) for k in final_dict] 
> [['C', 16, 'F', 50, 60], 
    ['B', 15, 'M', 0, 400], 
    ['C', 17, 'G', 0, 600], 
    ['A', 14, 'Y', 0, 200]] 

Wenn die Reihenfolge der Liste ist wichtig, Sie kann am Ende nur sortieren oder ein OrderedDict verwenden, um die Zusammenführung an erster Stelle zu erstellen.

0

Ihr „join“ Algorithmus kann unabhängig für jedes Element arbeitet und ist einfach:

def join_list(item1, item2): 
    if item1[1] == item2[1]: 
     result = item1[:] 
     result[2] = item2[2] 
     result[4] = item2[4] 
     return (result,) 
    return item1[:], item2[:] 

Diese Funktion gibt immer Tupeln: Singletons im cas der Gleichheit oder Paare im allgemeinen Fall.

Sie können diese Funktion auf Ihre beiden Listen list1 und list2 anwenden, indem Sie die Funktion map() verwenden.Aber das Ergebnis wird (ein Generator in Python 3 in der Tat), die eine Liste von Tupeln, so dass Sie das Ergebnis glätten müssen:

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]] 
list2 = [['A', 14, 'Y', 0, 200], ['B', 15, 'M', 0, 400], ['C', 17, 'G', 0, 600]] 

joined = [x 
      for row in map(join_list, list1, list2) 
      for x in row] 
print(joined) 

Sie bekommen, was Sie erwarten.

Verwandte Themen