2016-11-02 4 views
2

辞書をPythonで辞書にインポートしようとしています。 Python:リストに余分な数字が入った辞書を辞書に追加する

私はこのコードを書いた:

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)) 

を、私はこの結果を得た:{1: [3, 2, 5], 2: [4], 3: [4, 2], 5: [2], 7: [3], 10: [2]}正しいです。

さて、私の質問は、私は変更する必要があるもの、である、または結果はこのように見えるように取得するための手順ものです:{1: [3, 2, 5], 2: [0, 4, 0], 3: [4, 0, 2], 5: [0, 2, 0], 7: [0, 0, 3],10: [2, 0, 0]}

リストの最初の要素はIDと見なされます。 ゼロは、このIDが最初のリストに見つかりませんでした。

+1

あなたはループ用のコードで多くのコードを繰り返しています。それを関数に分割することを検討してください。 – erip

答えて

2

最初に新しいIDが辞書に挿入されると、3つの要素を持つリストが2つのヌル値で作成されます。 次に、既存のidに挿入すると、対応する要素が既存の3要素リストに置き換えられます。

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

あなたはcollections.defaultdictを使用し、各引数のインデックスでenumerateargsを反復、数字が挿入されるように*argsを使用するように機能を変更することができます。

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]}) 

これは、希望あなたの関数が可変数の引数を扱うことを可能にして、の結果をのように返すこともできます。例えば、

print(merge_tuples(line_a, line_b)) 
# {1: [3, 2], 10: [2, 0], 3: [4, 0], 2: [0, 4], 5: [0, 2]}) 
関連する問題