2017-02-08 3 views
1

Ich habe eine Liste von Wörterbüchern mit Informationen in einem solchen Format:Parsing Werte aus einer Liste von Wörterbüchern mit verschachtelten Liste in Python

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

Zuerst Python-Liste mit allen Namen Werten erstellen:

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

Allerdings weiß ich nicht, was wäre der beste Weg, um alle Namen Werte zu erhalten, wenn die Liste verschachtelte Liste (n) mit Wörterbüchern neben, wie folgt haben wird:

Wie kann ich alle diese Namen Werte erhalten: Painted, Wood, Mirror, Gold Leaf?

Wie könnte ich auch die Namenswerte aus allen Wörterbüchern in jeder verschachtelten Liste in einen Wert zusammenführen und dann mit anderen in eine Liste aufnehmen, würde also solche Werte erhalten: Painted Wood, Mirror, Gold Leaf.

Es wird keine Listen mehr Ebenen und nicht mehr als zwei Wörterbücher in ihnen verschachtelt, so für z.B. von dieser Liste unten müssten solche Werte erhalten werden: Gemaltes Holz, Spiegel, lackiertes Holz, Blattgold.

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

Etwas, das mir gerade aufgefallen ist: Sollten die Ergebnisse Ihres letzten Beispiels "Painted Wood" als einzelne Saite enthalten, anstatt "Painted" und "Wood" als getrennte Saiten? Wenn dem so ist, stimmt das nicht mit Ihrem ersten Beispiel überein, und in diesem Fall brauchen wir, glaube ich, noch mehr Klarheit darüber, was Sie meinen. –

Antwort

0

Der beste Weg, um die komplexe Liste Sie eine Funktion wie diese haben zu abzuflachen wäre:

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] 

Diese Funktion nimmt Ihre p_mat_list als Argument und gibt eine einzige Liste von Wörterbüchern.

get_list = flatten(p_mat_list) 

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

Ihre product_materials Liste:

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

Beachten Sie, dass einige es als Antipattern betrachten, um ein Lambda an einen Namen zu binden. Diese Quellen behaupten, dass in diesen Fällen eine vollwertige benannte Funktion definiert werden sollte. –

+2

"Some" ist der offizielle Python Style-Guide. –

+0

@AndrasDeak Wie wäre es jetzt? – Jarvis

2

Wenn Sie in einer externen Bibliothek zu bringen offen sind, können Sie die collapse() function von more-itertools nutzen könnten. Verwenden Sie es so etwas wie diese:

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

Dann in Ihrem Fall können Sie nur den Wert extrahieren zu 'name' von jedem dict entspricht, anstatt eine Liste von ihnen zu machen.

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

Dies hat den Vorteil, dass Sie sich keine Gedanken darüber machen müssen, wie viele Ebenen der Nesting-Liste es gibt.

Verwandte Themen