协慌网

登录 贡献 社区

在 Python 中创建一个包含列表推导的字典

我喜欢 Python 列表理解语法。

它也可以用来创建字典吗?例如,通过迭代成对的键和值:

mydict = {(k,v) for (k,v) in blah blah blah}  # doesn't work

答案

在 Python 2.6 及更早版本中,dict 构造函数可以接收可迭代的键 / 值对:

d = dict((key, value) for (key, value) in iterable)

从 Python 2.7 和 3 开始,您可以直接使用dict 理解语法

d = {key: value for (key, value) in iterable}

当然,您可以以任何您想要的方式使用 iterable(元组和列表文字,生成器理解,列表推导,生成器函数,函数组合...... 感觉有创意),只要每个元素本身是两个元素的可迭代:

d = {value: foo(value) for value in sequence if bar(value)}

def key_value_gen(k):
   yield chr(k+65)
   yield chr((k+13)%26+65)
d = dict(map(key_value_gen, range(26)))

额外奖励:如果您想迭代键列表key_list以及值列表value_list

d = dict((key, value) for (key, value) in zip(key_list, value_list))

要么

d = {(key, value) for (key, value) in zip(key_list, value_list)}

在 Python 3 和 Python 2.7 + 中,字典理解如下所示:

d = {k:v for k, v in iterable}

对于 Python 2.6 或更早版本,请参阅fortran 的答案

事实上,如果它已经理解了某种映射,你甚至不需要迭代迭代,dict 构造函数会为你做得很好:

>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}