在 Python 循环中构建字典 - 列表和字典理解

Posted

技术标签:

【中文标题】在 Python 循环中构建字典 - 列表和字典理解【英文标题】:Build Dictionary in Python Loop - List and Dictionary Comprehensions 【发布时间】:2013-10-07 22:33:10 【问题描述】:

我在 python 中玩一些循环。我对使用“for”循环非常熟悉:

for x in y:
    do something

您还可以使用循环创建一个简单的列表:

i = []
for x in y:
   i.append(x)

然后我最近在 Stack 上发现了一种非常有效的循环类型,用于构建一个列表(这种类型的循环有名称吗?我真的很想知道,以便更好地搜索它):

[x.name for x in y]

好的,话虽如此,我想更进一步地使用最后一种循环,我尝试使用相同类型的逻辑构建一个 python 字典:

x[row.SITE_NAME] = row.LOOKUP_TABLE for row in cursor

而不是使用:

x = 
for row in cursor:
   x[row.SITE_NAME] = row.LOOKUP_TABLE

我在等号上收到一条错误消息,告诉我这是一个无效的语法。我相信在这种情况下,它基本上告诉我等号是条件子句 (==),而不是变量的声明。

我的第二个问题是,我可以使用这种类型的循环构建一个 python 字典还是我离基地很远?如果是这样,我将如何构建它?

【问题讨论】:

你要找的名字是list-comprehension 您遇到语法错误,因为您使用方括号打开它并使用大括号将其关闭,并且您应该使用: 而不是=x[row.SITE_NAME] : row.LOOKUP_TABLE for row in cursor 我已经制作了a video that covers list comprehensions,它是各种表亲(set 和 dict 理解,以及生成器表达式),因为它在 SO 上出现了很多。将其描述为“循环类型”可能有点低估了它。 理解力很好....继续努力 谢谢大家!你们都很快回答了我的问题,我正是我想要的!此外,我更新了帖子的标题以供将来搜索。 【参考方案1】:

简写如下(称为dict理解,类似于list理解set理解等):

x =  row.SITE_NAME : row.LOOKUP_TABLE for row in cursor 

所以通常给定一些带有某种元素的_container 和一个函数_value,它对于给定的元素返回您要添加到字典中此键的值:

 _key : _value(_key) for _key in _container 

【讨论】:

这太棒了。我有一种感觉,这是堆栈上相当多余的问题,但我找不到循环的名称,所以我的搜索没有找到我正在寻找的答案。这很好用。我还在最后添加了一个条件 (x = row.SITE_NAME : row.LOOKUP_TABLE for row in cursor if row.LOOKUP_TABLE None 非常感谢 lejlot 和所有其他人!【参考方案2】:

您使用的称为列表推导。他们非常棒;)

他们有一个表亲,称为生成器表达式,其工作方式类似于列表推导式,但不是一次构建所有列表,而是一次生成一个项目。因此名称生成器。您甚至可以构建作为生成器的函数 - 不过,有很多问题和网站可以涵盖这些信息。

您可以做以下两件事之一:

x = dict(((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor))

或者,如果你有一个足够新的 Python 版本,有一种叫做字典推导式的东西——它的工作原理类似于列表推导式,但会生成字典。

x = row.SITE_NAME : row.LOOKUP_TABLE for row in cursor

【讨论】:

澄清一下,“足够新的 Python 版本”意味着 2.7+ 对于使用 【参考方案3】:

你可以这样做:

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)

【讨论】:

以上是关于在 Python 循环中构建字典 - 列表和字典理解的主要内容,如果未能解决你的问题,请参考以下文章

Python面试必考重点之列表,元组和字典第六关——快速调换字典中的key和value/用循环快速生成一个从0到100的列表

使用 Python 从列表和字典构建数组

Python 3.5 遍历字典列表

python 从列表中取出一个字典元素

Python - 尝试通过 for 循环创建字典

使用字典 get() 作为函数从地图创建 Python 列表与使用 for 循环创建字典 get() 列表