2017-04-21 69 views
-1

我和我的一個朋友今天面臨着一項棘手的任務,我認爲在這裏值得分享。使用Python中的詞典理解創建一個單獨的鍵和值列表中的詞典

這是基礎:

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

我們想創建一個字典的格式如下:

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

棘手的部分是,我們希望做它只有一條線。

我對你會想到的方法很感興趣!

+0

Stack Overflow是不是代碼寫作服務。 – Vallentin

+0

嘗試[CodeGolf](https://codegolf.stackexchange.com/) – GiantsLoveDeathMetal

回答

1

棘手的部分是我們想只做一行。

您可以將幾個zip連接在一起。

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

如果你現在要做的print(d)它會輸出:

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

當然,這是假設value.split()總會導致3倍的值。

編輯:如果你想在元組是列表,則拋出list(a) for a in ...混進去:

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

,輸出:

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

你可以用'lists'輸出它們嗎? – nlsdfnbch

+1

@nlsdfnbch是的,看看我的編輯。 – Vallentin

0

有關使用numpy如何?

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']} 

基準:看起來像@此Vallentin的答案是更快

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