36

我正在玩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

3 回答 3

58

简短形式如下(称为dict comprehension,类似于列表理解集合理解等):

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

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

{ _key : _value(_key) for _key in _container }
于 2013-10-01T16:50:57.023 回答
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}
于 2013-10-01T16:55:13.927 回答
6

You can do it like this:

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)
于 2013-10-01T16:52:44.337 回答