假设我有类似的东西:
list1 = [{"l1_key_1": "l1_value_1", "l1_key_2": "l1_value_2", "l1_key_3": "l1_value_3"}, {...}]
list2 = [{"l2_key_1": "l2_value_1", "l2_key_2": "l2_value_2", "l2_key_3": "l2_value_3"}, {...}]
我正在尝试获得类似于以下内容的输出:
list2 = [{"l2_key_1": ["l1_value_1", "l2_value_1"], "l2_key_2": "l2_value_2", "l2_key_3": "l2_value_3"}, {...}]
我尝试使用zip()
和defaultdict
方法来解决这个问题,但是运气不佳。
我本质上是想知道如何将第一个元素的第一和第二个键的值合并到一个列表中,对第二个元素进行相同的操作,依此类推。
答案 0 :(得分:1)
从list2
复制字典。然后从两个字典中获取第一个键和值,将这些值组合到一个列表中,并用该列表替换第一个字典元素。
使用列表推导功能对每对词典执行此操作。
def combine_dicts(d1, d2):
first_value1 = list(d1.values())[0]
first_key, first_value2 = list(d2.entries())[0]
new_dict = d2.copy()
new_dict[first_key] = [first_value1, first_value2]
return new_dict
result = [combine_dicts(d1, d2) for (d1, d2) in zip(list1, list2)]
这假定两个列表的长度相同。否则,列表之一中的多余元素将被丢弃。
答案 1 :(得分:0)
看看您的输出,我看到输出中的某些项目是列表,有些是字符串。我认为这是一种反模式。我认为最好将所有项目都列为列表(即使列表中只有一项或零项也是如此)。
以下是执行我认为您要问的代码:
from collections import defaultdict
new_list = []
for d1, d2 in zip(list1, list2):
new_dict = defaultdict(list)
for k, v in d1.items():
new_dict[k].append(v)
for k, v in d2.items():
new_dict[k].append(v)
new_list.append(new_dict)
要注意的一件事是,如果list1和list2的大小不同,zip
将仅使用不超过较短列表长度的元素。如果您坚持在输出中同时包含列表类型和字符串类型,则代码会稍微复杂一些,但我认为这样做没有任何好处。