2017-04-21 64 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