2017-01-18 2 views
0

Я пытаюсь узнать/учить себя Python3, и я работаю над переформатированием очищенных веб-данных.Python3: Добавить в словари в списке, на основе других словарей

Входного список словарей:

[{'name' : 'Anna', 'gender': "f", 'ID': 512128, 'age' : 28}, 
{'name' : 'Barney', 'gender': "m", 'ID': 012428, 'age' : 29}, 
{'name' : 'Cesar', 'gender': "m", 'ID': 032536, 'age' : 57}] 

Я хотел бы достигнуть список словарей с каждым словарем с дополнительными именами полей «коллегами», который содержит информацию о другого словари в списке.

Желаемый результат:

[{'name' : 'Anna', 'gender': "f", 'ID': 512128, 'age' : 28, 'colleagues' : [{'name' : 'Barney', 'gender': "m", 'ID': 012428, 'age' : 29}, {'name' : 'Cesar', 'gender': "m", 'ID': 032536, 'age' : 57}]}, 
{'name' : 'Barney', 'gender': "m", 'ID': 012428, 'age' : 29, 'colleagues' : [{'name' : 'Anna', 'gender': "f", 'ID': 512128, 'age' : 28}, {'name' : 'Cesar', 'gender': "m", 'ID': 032536, 'age' : 57}]}, 
{'name' : 'Cesar', 'gender': "m", 'ID': 032536, 'age' : 57, 'colleagues' : [{'name' : 'Anna', 'gender': "f", 'ID': 512128, 'age' : 28}, {'name' : 'Barney', 'gender': "m", 'ID': 012428, 'age' : 29}]}] 

Как вы можете сказать, что я новичок в Python, но понять простое понимание и за петлями .. и т.д. Я провел последнюю ночь со всеми возможными попытками и очень вложенного цикла структур, которые вызывали бесконечные петли.

Я надеюсь, что один из экспертов может помочь мне, как подойти к этой задаче, любая помощь очень ценится .. Спасибо!

ответ

1
output = [dict([*p.items(), 
       ['colleagues', [q for q in input if p != q]] 
       ]) for p in input] 

Возможно, вы сможете ускорить его с помощью наборов и inputset - set(p).

Весь dict([*p.items(), [k, v]]) - это своего рода взлом для создания нового dict с дополнительной парой ключ-значение без использования операторов. Это в значительной степени эквивалентно dict_with_new_pair(p, k, v) Дано:

def dict_with_new_pair(d, k, v): 
    from copy import copy 
    c = copy(d) 
    c[k] = v 
    return c 

EDIT: Как вы сказали, как p и q элементы input. Выражение разбирает как это: Для каждого человека p в input, обогащают его с ключом colleagues, значение которого будет все лица q в input, которые не p (и собрать список всех таких обогащается p в новый список output).

+0

Удивительно, это решило мою проблему, спасибо! Мне интересно, как работает код. Понимание списка повторяется через словари входного списка, и вы объяснили, что делает dict ([* p.items(), [k, v]]). Не могли бы вы объяснить условие if и что означают p и q? Оба кажутся элементами ввода. В очередной раз благодарим за помощь ! –

Смежные вопросы