Добрый день, имеется следующий список словарей:
example = [ { 'name' : 'John', 'name2' : 'Mike' }, { 'name' : 'Smith', 'name2' : 'John' }, { 'name' : 'Bob', 'name2' : 'Bob' }, { 'name' : 'Mike', 'name2' : 'Smith' }, { 'name' : 'Mike', 'name2' : 'Maria' } ]
Посоветуйте прием (как итерировать и преобразовывать), чтобы получишь на выходе список данного вида:
output = [ { 'name' : 'John' }, { 'name' : 'Mike' }, { 'name' : 'Smith' }, { 'name' : 'Bob' }, { 'name' : 'Maria' } ]
Анонимный пользователь Изменен статус публикации
output = [{'name': x} for x in set(reduce(lambda x, y: x+y, [x.values() for x in example]))]
тот же код в подробностях:
>>> names = [x.values() for x in example] >>> names [['Mike', 'John'], ['John', 'Smith'], ['Bob', 'Bob'], ['Smith', 'Mike'], ['Maria', 'Mike']] >>> names = reduce(lambda x, y: x+y, names) >>> names ['Mike', 'John', 'John', 'Smith', 'Bob', 'Bob', 'Smith', 'Mike', 'Maria', 'Mike'] >>> names = set(names) >>> names set(['Mike', 'John', 'Smith', 'Bob', 'Maria']) >>> output = [{'name': x} for x in names] >>> output [{'name': 'Mike'}, {'name': 'John'}, {'name': 'Smith'}, {'name': 'Bob'}, {'name': 'Maria'}]
uniq_names = set(name for d in example for name in d.values()) output = [{'name': name} for name in uniq_names]
- чтобы все имена из списка словарей извлечь, используется генератор с вложенным циклом
- чтобы удалить дубликаты, используется
set()
- чтобы создать результирующий список словарей, используется простой генератор списков
Результат
[{'name': 'Mike'}, {'name': 'Bob'}, {'name': 'Smith'}, {'name': 'John'}, {'name': 'Maria'}]