Python 压缩列表[Dict[key,List]],以便复制的键的列表转换为每个唯一键的列表

Python 压缩列表[Dict[key,List]],以便复制的键的列表转换为每个唯一键的列表,python,list,python-2.7,dictionary,set,Python,List,Python 2.7,Dictionary,Set,如果标题令人困惑,请道歉。这些例子可能会更清楚地说明这一点。我有一个列表[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'},

如果标题令人困惑,请道歉。这些例子可能会更清楚地说明这一点。我有一个列表[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解决方案,因为我的搜索没有返回任何结果


作为旁注,我也更喜欢将“值”和“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']}]

除了交换键和值时的部件外,此功能工作正常。我无法复制即使在摆弄了“out=”行之后,您如何能够将ID放在第一位。不管怎样,非常感谢您提供此解决方案。