浓缩列表[Dict[key,List]],以便重复的键将其列表转换为每个唯一键的列表



如果标题令人困惑,请道歉。这些例子可能会使情况更加清楚。我有一个List[Dict[str,List]],它被格式化为一个值列表与密钥ID相关联(示例数据(:

[{'values':['1','2','3','4'],'ID':'AAA'},{'values':['5','6','7',"8"],"ID":"AAA"},{"values":["9","10","11","12"],"ID":"BBB"},{'values':['13','14','15','16'],'ID':"BBB"},{"values":[‘17’,‘18’,‘19’,"20"],"ID":"CCC"},{"values":["21",'22','23','24'],'ID':'CCC'}]

我想压缩它,这样ID就变得唯一,如果一个ID有多个值列表,它们就会组合成一个列表列表,这样前面的例子就变成了:

[{'values':[['1','2','3','4'],['5','6','7','8']],'ID':'AAA'},{'values':[['9','10','11','12'],[[13','14','15','16']],'ID':'BBB'},{'values':[['17','18','19','20'],[['21','22','23','24']],'ID':'CCC'}]

我很难做到这一点。我的第一个想法是提取所有的ID,并将它们放在一个单独的集合中,使它们是唯一的,但后来我不知道如何继续更改结构,使列表实际上成为列表列表。我想知道是否有任何直观的Python解决方案,因为我的搜索没有返回任何结果。

顺便说一句,我也更喜欢交换"值"one_answers"ID",这样ID就放在第一位,但这实际上并不重要,只是在我看来更容易理解。

您可以使用临时字典,其中键是ID键,值是列表列表。然后将此词典转换为词典列表:

from pprint import pprint
lst = [
{"values": ["1", "2", "3", "4"], "ID": "AAA"},
{"values": ["5", "6", "7", "8"], "ID": "AAA"},
{"values": ["9", "10", "11", "12"], "ID": "BBB"},
{"values": ["13", "14", "15", "16"], "ID": "BBB"},
{"values": ["17", "18", "19", "20"], "ID": "CCC"},
{"values": ["21", "22", "23", "24"], "ID": "CCC"},
]
out = {}
for item in lst:
out.setdefault(item["ID"], []).append(item["values"])
out = [{"ID": k, "values": v} for k, v in out.items()]
pprint(out)

打印:

[{'ID': 'AAA', 'values': [['1', '2', '3', '4'], ['5', '6', '7', '8']]},
{'ID': 'BBB', 'values': [['9', '10', '11', '12'], ['13', '14', '15', '16']]},
{'ID': 'CCC', 'values': [['17', '18', '19', '20'], ['21', '22', '23', '24']]}]

最新更新