2017-04-21 8 views
-1

Ein Freund von mir und ich standen heute vor einer kniffligen Aufgabe. Ich dachte, es wäre wert, sie hier zu teilen.Erstellen eines Wörterbuchs aus einer separaten Liste von Schlüsseln und Werten mit dict-Verständnis in Python

Dies ist die Basis:

keys = ["name", "surname", "age"] 
values = ['John Miller 20', 
      'James Smith  30', 
      'Gary Jones  50' 
     ] 
d = {} 

Wir möchten ein Wörterbuch in folgendem Format erstellen:

{'name': ['John', 'James', 'Gary'], 
'surname': ['Miller', 'Smith', 'Jones'], 
'age': [20, 30, 50]} 

Der schwierige Teil ist, dass wir es nur eine Zeile tun möchte in .

Ich bin sehr interessiert an den Ansätzen, die Sie kommen werden!

+0

Stack-Überlauf ist kein Code schriftlich Service. – Vallentin

+0

Versuchen Sie [CodeGolf] (https://codegolf.stackexchange.com/) – GiantsLoveDeathMetal

Antwort

1

Der schwierige Teil ist, wir möchten es in nur einer Zeile tun.

Sie könnten ein paar zip s zusammenbinden.

d = dict(zip(keys, list(zip(*[value.split() for value in values])))) 

Wenn Sie jetzt print(d) tun würde es Ausgabe:

{'name': ('John', 'James', 'Gary'), 'surname': ('Miller', 'Smith', 'Jones'), 'age': ('20', '30', '50')} 

Das ist natürlich davon aus, dass value.split() immer in 3 Werten führt.

Edit: Wenn Sie die Tupel wollen Listen sein, dann list(a) for a in ... in den Mix werfen:

d = dict(zip(keys, list(list(a) for a in zip(*[value.split() for value in values])))) 

Welche Ausgänge:

{'name': ['John', 'James', 'Gary'], 'surname': ['Miller', 'Smith', 'Jones'], 'age': ['20', '30', '50']} 
+0

Könnten Sie sie auch als 'Listen' ausgeben, mit Ihrer Linie? – nlsdfnbch

+1

@nlsdfnbch ja, schau dir meine Edit an. – Vallentin

0

Wie wäre es numpy mit?

import numpy as np 

d = dict(zip(keys, np.array([i.split() for i in values]).transpose().tolist())) 

{'age': ['20', '30', '50'], 
'name': ['John', 'James', 'Gary'], 
'surname': ['Miller', 'Smith', 'Jones']} 

Benchmarks: Sieht aus wie @ Vallentin Antwort schneller

ist
time d = dict(zip(keys, list(zip(*[value.split() for value in values])))) 

CPU times: user 23 µs, sys: 1 µs, total: 24 µs 
Wall time: 29.1 µs 

time d = dict(zip(keys, np.array([i.split() for i in values]).transpose().tolist())) 

CPU times: user 41 µs, sys: 6 µs, total: 47 µs 
Wall time: 47.9 µs 
Verwandte Themen