创建具有列表理解的字典

我喜欢 Python 列表理解语法。

它也可以用来创建字典吗?例如,通过遍历键和值对:

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

答案

从 Python 2.7 和 3 开始,您应该只使用dict comprehension 语法

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

在 Python 2.6 和更早版本中,内置的dict可以接收键 / 值对的迭代,因此您可以将其传递给列表理解或生成器表达式。例如:

dict((key, func(key)) for key in keys)

但是,如果您已经具有可迭代的键和 / 或值,则根本不需要使用任何理解 - 最简单的方法是直接调用内置的dict

# consumed from any iterable yielding pairs of keys/vals
dict(pairs)

# "zipped" from two separate iterables of keys/vals
dict(zip(list_of_keys, list_of_values))

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

在 Python 2.7 中,它类似于:

>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}

压缩他们

在 Python 中创建具有列表理解的字典

我喜欢 Python 列表理解语法。

它也可以用来创建字典吗?例如,通过遍历键和值对:

mydict = {(k,v) for (k,v) in blah blah blah}

您正在寻找 “dict comprehension” 一词 - 实际上是:

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

假设blah blah blah是两个元组的迭代 - 您是如此亲密。让我们创建一些类似的 “blah”:

blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

Dict 理解语法:

现在,这里的语法是映射部分。是什么让这个dict的理解,而不是一set的理解(这是你的伪代码近似于什么)是结肠, :如下图所示:

mydict = {k: v for k, v in blahs}

而且我们看到它起作用了,并且应该保留 Python 3.7 的插入顺序:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

在 Python 2 和 3.6 以下版本中,不能保证顺序:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}

添加过滤器:

所有的理解都具有一个映射组件和一个过滤组件,您可以为它们提供任意表达式。

因此,您可以在末尾添加一个过滤器部分:

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

在这里,我们只是测试最后一个字符是否可以被 2 整除以在映射键和值之前过滤掉数据。

Python 版本 < 2.7 (RIP,2010 年 7 月 3 日 - 2019 年 12 月 31 日) ,请执行以下操作:

d = dict((i,True) for i in [1,2,3])

Python 版本 > = 2.7,请执行以下操作:

d = {i: True for i in [1,2,3]}

要添加到 @fortran 的答案中,如果要遍历键列表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)}

这是使用 dict 理解创建字典的另一个示例:

我在这里要做的是在每对字典中创建一个字母字典。是英文字母及其在英文字母中的对应位置

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>>

请注意,此处使用枚举可获取字母列表及其列表中的索引,并交换字母和索引以生成字典的键值对

希望它对您的字典组合有一个好主意,并鼓励您更多地使用它来使代码紧凑

尝试这个,

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

假设我们有两个清单, 国家首都

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

然后从两个列表中创建字典:

print get_dic_from_two_lists(country, capital)

输出是这样的,

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

仅举另一个例子。假设您有以下列表:

nums = [4,2,2,1,3]

并且您想将其转换为 dict,其中键是索引,值是列表中的元素。您可以使用以下代码行执行此操作:

{index:nums[index] for index in range(0,len(nums))}