在Python循环中构建字典 - 列表和字典推导式

39

我正在使用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字典,还是我完全错了? 如果可以,我该如何构造它?


4
你要找的名字是 list-comprehension - smac89
1
你得到了一个语法错误,因为你用一个方括号打开它并用一个花括号关闭它,并且应该使用:而不是= {x[row.SITE_NAME] : row.LOOKUP_TABLE for row in cursor} - bheklilr
1
我制作了一个视频,涵盖了列表推导式及其各种衍生形式(集合和字典推导式以及生成器表达式),因为在SO上经常会遇到这个问题。把它描述为“一种循环类型”可能有点低估它的价值。 - Gareth Latty
1
推导式很棒……继续努力! - Tom Swifty
谢谢大家!你们都很快回答了我的问题,我现在拥有了我所需要的东西!此外,我更新了帖子的标题以便未来搜索。 - Mike
3个回答

61

简写形式如下(称为字典推导式,类比于列表推导式集合推导式等):

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

一般来说,假设有一个_container包含一些元素,并且有一个函数 _value,给定一个元素,它返回要添加到此键中的值:

{ _key : _value(_key) for _key in _container }

3
太棒了!我原本觉得这是一个常见的问题,但我找不到循环的名称,所以我的搜索结果没有找到我想要的答案。这个方法非常有效。最后我还添加了一个条件语句(x = { row.SITE_NAME : row.LOOKUP_TABLE for row in cursor if row.LOOKUP_TABLE <> None})。非常感谢lejlot和其他人! - Mike

9
你正在使用的是列表推导式。它们非常棒 ;) 它们有一个名为生成器表达式的近亲,其工作原理类似于列表推导式,但不是一次性构建整个列表,而是逐个生成项目。因此称为生成器。你甚至可以构建作为生成器的函数 - 有很多问题和网站来涵盖这些信息,但是。 你可以做两件事之一:
x = dict(((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor))

如果您的Python版本足够新,还可以使用字典推导式 - 它与列表推导式类似,但产生的是一个字典。

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

2
澄清一下,“足够新的Python版本”指的是2.7+。对于那些使用<2.7的人来说,第一个选项似乎是唯一可用的选择。 - hamx0r

6
您可以像这样做:
x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接