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

Condense List[Dict[key, list]] so that duplicated keys have their lists converted to list of lists for each unique key

如果标题令人困惑,我们深表歉意。这些例子可能会使它更清楚。我有一个 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 解决方案,因为我的搜索没有返回任何结果。

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