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

时间:2013-10-01 16:49:04

标签: python for-loop

我在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字典,还是我离开基地?如果是这样,我将如何构建它?

3 个答案:

答案 0 :(得分:45)

简短形式如下(称为字典理解,类似于列表理解设置理解等):

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

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

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

答案 1 :(得分: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 :(得分:5)

你可以这样做:

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