使用Python中的dict理解从单独的键和值列表创建字典

时间:2017-04-21 12:04:43

标签: python dictionary list-comprehension

我和我的一位朋友今天面临着一项棘手的任务,我认为值得在这里分享。

这是基础:

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

棘手的部分是我们只想在一行中完成它。

我对你提出的方法非常感兴趣!

2 个答案:

答案 0 :(得分: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']}

答案 1 :(得分: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