Уплотните список[Дикт[ключ, список]], чтобы дублированные ключи преобразовывали свои списки в список списков для каждого уникального ключа

#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=». Несмотря на это, большое вам спасибо за это решение.