2017-02-08 1 views
1

У меня есть список словарей с информацией в таком формате:значения Разбор из списка словарей с вложенного списка в Python

p_mat_list = [ 
    {'name': 'Mirror', 'link': '/somelink1/'}, 
    {'name': 'Gold Leaf', 'link': '/somelink2/'} 
] 

Во-первых, создать список питона со всеми значениями имени:

product_materials = [] 
for material in p_mat_list: 
    product_materials.append(material['name']) 

Однако я не знаю, как лучше всего получить все значения имени, когда список будет иметь вложенный список (-и) со словарями рядом, как показано ниже:

p_mat_list = [ 
    [{'name': 'Painted'}, {'name': 'Wood'}], 
    {'name': 'Mirror'}, 
    {'name': 'Gold Leaf'} 
] 

Как я могу получить все эти значения: Painted, Wood,, Gold Leaf?

Кроме того, как я могу подойти к объединению значений имен из всех словарей внутри каждого вложенного списка в одно значение, а затем получить это в список с другими, так что бы получить такие значения: Painted Wood, Mirror, Gold Leaf.

Не будет списков, вложенных в другие уровни и не более двух словарей внутри них, например, например. из этого списка ниже нужно было бы получить такие значения: Окрашенные древесины, зеркало, лакированное дерево, золотой лист.

p_mat_list = [ 
[{'name': 'Painted'}, {'name': 'Wood'}], 
{'name': 'Mirror'}, 
[{'name': 'Varnished'}, {'name': 'Wood'}], 
{'name': 'Gold Leaf'} 
] 
+0

Что-то, что я только что заметил: если результаты вашего последнего примера действительно включают '' Painted Wood'' как одну строку, а не '' Painted'' и '' Wood'' как отдельные строки? Если это так, это несовместимо с вашим первым примером, и в этом случае я думаю, нам понадобится еще несколько разъяснений в отношении того, что вы имеете в виду. –

ответ

0

Лучше всего было бы, чтобы сгладить сложный список у вас есть функция, как это:

def flatten(x): 
    if isinstance(x, dict) : 
     return [x] 
    elif isinstance(x, collections.Iterable) : 
     return [a for i in x for a in flatten(i)] 
    else: 
     return [x] 

Эта функция, принимает ваш p_mat_list в качестве аргумента и возвращает список словарей.

get_list = flatten(p_mat_list) 

product_materials = [] 
for material in get_list : 
    product_materials.append(material['name']) 

Ваш product_materials список:

['Painted', 'Wood', 'Mirror', 'Gold Leaf'] 
+2

Обратите внимание, что некоторые считают антипаттерн привязкой лямбда к имени. Эти источники утверждают, что в этих случаях следует определить полнофункциональную именованную функцию. –

+2

«Некоторые» являются официальным руководством по стилю Python. –

+0

@AndrasDeak Как насчет сейчас? – Jarvis

2

Если вы открыты для привлечения внешней библиотеке, вы можете использовать collapse() function из more-itertools. Используйте это что-то вроде этого:

>>> list(mt.collapse(p_mat_list, base_type=dict)) 
[{'name': 'Painted'}, 
{'name': 'Wood'}, 
{'name': 'Mirror'}, 
{'name': 'Gold Leaf'}] 

Тогда в вашем случае, вы можете просто извлечь значение, соответствующее 'name' от каждого Словаре, вместо того, чтобы их список.

>>> [d['name'] for d in mt.collapse(p_mat_list, base_type=dict)] 

Это имеет то преимущество, что вам не нужно беспокоиться о том, сколько уровней гнездования списка существует.