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