Pythonic Weg, um zu konvertieren Liste von dicts in die Liste der namedtuples
Ich habe eine list
von dict
. Müssen konvertieren list
von namedtuple
(bevorzugt) oder einfach tuple
beim aufteilen ersten Variablen durch ein Leerzeichen.
Was ist mehr pythonic Weg, es zu tun?
Ich vereinfacht meinen code ein wenig. Verstehens, gen Ausdrücken und itertools Nutzung begrüßt.
Daten:
dl = [{'a': '1 2 3',
'd': '*',
'n': 'first'},
{'a': '4 5',
'd': '*', 'n':
'second'},
{'a': '6',
'd': '*',
'n': 'third'},
{'a': '7 8 9 10',
'd': '*',
'n': 'forth'}]
Einfachen Algorithmus:
from collections import namedtuple
some = namedtuple('some', ['a', 'd', 'n'])
items = []
for m in dl:
a, d, n = m.values()
a = a.split()
items.append(some(a, d, n))
Ausgabe:
[some(a=['1', '2', '3'], d='*', n='first'),
some(a=['4', '5'], d='*', n='second'),
some(a=['6'], d='*', n='third'),
some(a=['7', '8', '9', '10'], d='*', n='forth')]
InformationsquelleAutor scraplesh | 2011-10-20
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unten @Petr Viktorin Punkte out das problem mit meiner ursprünglichen Antwort und Ihre anfängliche Lösung:
(Ich bin ein bisschen beschämt, wollte ich nicht, diesen pick-up in den ersten Platz, und bekam 45 rep dafür!)
Verwenden @eryksun Vorschlag stattdessen:
Meine ursprüngliche, falsche Antwort. Verwenden Sie es nicht, es sei denn, Sie haben eine Liste von
OrderedDict
.values()
dictionary werden nicht in einer bestimmten Reihenfolge! Wenn diese Lösung funktioniert, unda, d, n
sind wirklich wieder in Ordnung, es ist nur ein Zufall. Wenn Sie eine andere version von Python oder erstellen Sie die dicts auf eine andere Weise, es könnte brechen. Verwenden Sie die Tasten direkt, wie in @eryksun Kommentar.OrderedDict
stattnamedtuple('xxx', d.keys())(**d)
ganz praktisch.Dachte, ich würde in Glockenspiel hier, nur weil ich Liebe namedtuples und Wörterbücher so viel!
Hier ist eine Liste Verständnis mit einem dict-comprehension in ihm, dass Sie tun können, Ihre erste Bearbeitung des Wörterbuchs:
Ich Häufig verwenden eine Rezept, die ich als "tupperware", die rekursiv konvertiert Wörterbücher namedtuples. Sehen die Kernaussage hier, für den code. Hier ist eine vereinfachte Stück, zu integrieren hier, und habe eine ziemlich saubere Art, das zu tun diese operation.
So gegeben, dass die Funktion, die Sie tun können, diese - die wir umgestalten, kurz:
Und jetzt, mit der besseren Kapselung und Lesbarkeit:
Neben der Antwort von @detly, wenn Sie nicht wissen, über die Felder des dicts vor der hand, können Sie konstruieren eine
namedtuple
Klasse mitAndere Möglichkeit, nicht sicher, ob es besser oder schlechter als die anderen:
BTW, ich bin nicht absolut verpflichtet zur Angabe der Basis-Klasse den gleichen Namen wie die Subklasse
some
. Ich mag es, weil es bedeutet, dass die resultierende Klasse konvertiert zu einem string mit dem Namensome
, und es ist nie besonders verursacht mir Probleme, aber möglicherweise könnte es verwirrend sein, wenn Sie Debuggen sind mit Klassennamen. So tun Sie es mit Sorgfalt.Oder die gleiche Idee mit verschiedenen tricks: