#python #list #python-2.7 #dictionary #set
Вопрос:
Приношу извинения, если название сбивает с толку. Примеры могут сделать это более ясным. У меня есть список[Dict[str, список]], который отформатирован таким образом, что список значений связан с идентификатором ключа (пример данных):
[{‘значения’: [‘1’, ‘2’, ‘3’, ‘4’], ‘Идентификатор’: ‘AAA’}, {‘значения’: [‘5’, ‘6’, ‘7’, ‘8’], ‘Идентификатор’: ‘AAA’}, {‘значения’: [‘9′, ’10’, ’11’, ’12’], ‘Идентификатор’: ‘BBB’}, {‘значения’: [’13’, ’14’, ’15’, ’16’], ‘Идентификатор’: ‘BBB’}, {‘значения’: [’17’, ’18’, ’19’, ’20’], ‘Идентификатор’: ‘CCC’}, {‘значения’: [’21’, ’22’, ’23’, ’24’], ‘ИДЕНТИФИКАТОР’: ‘CCC’}]
Я хотел бы сжать это так, чтобы идентификатор стал уникальным, и если для одного идентификатора существует несколько списков значений, они объединяются в Список списка, так что предыдущий пример становится:
[{‘значения’: [[‘1’, ‘2’, ‘3’, ‘4’],[‘5’, ‘6’, ‘7’, ‘8’]], ‘Идентификатор’: ‘AAA’}, {‘значения’: [[‘9′, ’10’, ’11’, ’12’],[’13’, ’14’, ’15’, ’16’]], ‘Идентификатор’: ‘BBB’}, {‘значения’: [[’17’, ’18’, ’19’, ’20’],[’21’, ’22’, ’23’, ’24’]], ‘ИДЕНТИФИКАТОР’: ‘CCC’}]
У меня возникают значительные трудности с выполнением этого. Моя первая идея состояла в том, чтобы извлечь все идентификаторы и поместить их в отдельный набор, чтобы они были уникальными, но затем я потерял представление о том, как продолжить изменение структуры, чтобы список фактически стал списком списков. Мне было интересно, есть ли для этого какое-либо интуитивно понятное решение на Python, поскольку мои поиски не дали никаких результатов.
В качестве примечания я бы также предпочел, чтобы «значения» и «идентификатор» поменялись местами, чтобы идентификатор стоял на первом месте, но на самом деле это не имеет значения, на мой взгляд, это просто облегчило бы просмотр.
Ответ №1:
Вы можете использовать временный словарь, где ключи-это ваши 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']]}]
Комментарии:
1. Это работает идеально, за исключением той части, когда ключи и значения были заменены. Я не мог повторить, как вам удалось получить идентификатор на первом месте, даже после того, как вы повозились со строкой «out=». Несмотря на это, большое вам спасибо за это решение.