Python:在列表中添加填充零的字典列表

时间:2016-11-02 10:28:54

标签: python list dictionary

我正在尝试将一些列表导入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。

2 个答案:

答案 0 :(得分:4)

您可以使用collections.defaultdict并修改您的函数以使用*args,以便使用enumerate遍历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]})

答案 1 :(得分:2)

一种解决方案是第一次在字典中插入新id时,会创建一个包含3个元素的列表(带有两个空值)。 然后,当插入现有的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