2016-11-02 5 views
2

Ich versuche, einige Listen zu Wörterbuch in Python zu importieren.Python: Liste zu Wörterbuch mit aufgefüllten Nullen in Liste hinzufügen

Ich schrieb diesen Code:

def merge_tuples(line_a, line_b, line_c): 
    id_dict = dict() 

    for line in line_a: 
     if line[0] in id_dict: 
      id_dict[line[0]].append(line[1]) 
     else: 
      id_dict[line[0]] = [line[1]] 

    for line in line_b: 
     if line[0] in id_dict: 
      id_dict[line[0]].append(line[1]) 
     else: 
      id_dict[line[0]] = [line[1]] 

    for line in line_c: 
     if line[0] in id_dict: 
      id_dict[line[0]].append(line[1]) 
     else: 
      id_dict[line[0]] = [line[1]] 

    return id_dict 

if __name__ == "__main__": 
    line_a = ((1, 3), (3, 4), (10, 2)) 
    line_b = ((1, 2), (2, 4), (5, 2)) 
    line_c = ((1, 5), (3, 2), (7, 3)) 
    print(merge_tuples(line_a, line_b, line_c)) 

und ich habe dieses Ergebnis: {1: [3, 2, 5], 2: [4], 3: [4, 2], 5: [2], 7: [3], 10: [2]} was richtig ist.

Nun, meine Frage ist, was ich ändern müssen, oder was sind die Schritte, das Ergebnis zu erhalten, wie folgt aussehen: {1: [3, 2, 5], 2: [0, 4, 0], 3: [4, 0, 2], 5: [0, 2, 0], 7: [0, 0, 3],10: [2, 0, 0]}

Das erste Element der Liste betrachtet ID. Null bedeutet, dass diese ID nicht in der ersten Liste gefunden wurde.

+1

Sie wiederholen eine Menge Code in diesen for-Schleifen. Ziehe in Betracht, das in eine Funktion zu brechen. – erip

Antwort

2

Eine Lösung wäre, dass beim ersten Einfügen einer neuen ID in das Wörterbuch eine Liste mit drei Elementen erstellt wird (mit zwei Nullwerten). Wenn Sie dann in eine bestehende ID einfügen, wird das entsprechende Element in der vorhandenen 3-Elemente-Liste ersetzt.

def merge_tuples(line_a, line_b, line_c): 
    id_dict = dict() 

    for line in line_a: 
     if line[0] in id_dict: 
      id_dict[line[0]].append(line[1]) 
     else: 
      id_dict[line[0]] = [line[1], 0, 0] 

    for line in line_b: 
     if line[0] in id_dict: 
      id_dict[line[0]][1] = line[1] 
     else: 
      id_dict[line[0]] = [0, line[1], 0] 

    for line in line_c: 
     if line[0] in id_dict: 
      id_dict[line[0]][2] = line[1] 
     else: 
      id_dict[line[0]] = [0, 0, line[1]] 

    return id_dict 
4

können Sie eine collections.defaultdict verwenden und Ihre Funktion ändern *args so zu verwenden, dass durch args mit enumerate laufen, werden die Zahlen am Index jedes Argument eingefügt:

from collections import defaultdict 

def merge_tuples(*args): 
    id_dict = defaultdict(lambda: [0]*len(args)) 
    for i, lines in enumerate(args): 
     for line in lines: 
      id_dict[line[0]][i] = line[1] 
    return id_dict 

if __name__ == "__main__": 
    line_a = ((1, 3), (3, 4), (10, 2)) 
    line_b = ((1, 2), (2, 4), (5, 2)) 
    line_c = ((1, 5), (3, 2), (7, 3)) 
    print(merge_tuples(line_a, line_b, line_c)) 
    # {1: [3, 2, 5], 2: [0, 4, 0], 3: [4, 0, 2], 5: [0, 2, 0], 7: [0, 0, 3], 10: [2, 0, 0]}) 

Dies würde erlauben Sie auch Ihrer Funktion, eine variable Anzahl von Argumenten zu behandeln und immer noch die richtigen Ergebnisse zu produzieren, zB:

print(merge_tuples(line_a, line_b)) 
# {1: [3, 2], 10: [2, 0], 3: [4, 0], 2: [0, 4], 5: [0, 2]}) 
Verwandte Themen