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

Mik*_*ike 29 python for-loop

我在python中玩一些循环.我对使用"for"循环非常熟悉:

for x in y:
    do something
Run Code Online (Sandbox Code Playgroud)

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

i = []
for x in y:
   i.append(x)
Run Code Online (Sandbox Code Playgroud)

然后我最近发现了一个很好的有效类型的循环,在这里,在堆栈上,建立一个列表(这种类型的循环有一个名称吗?我真的很想知道所以我可以更好地搜索它):

[x.name for x in y]
Run Code Online (Sandbox Code Playgroud)

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

{x[row.SITE_NAME] = row.LOOKUP_TABLE for row in cursor}
Run Code Online (Sandbox Code Playgroud)

而不是使用:

x = {}
for row in cursor:
   x[row.SITE_NAME] = row.LOOKUP_TABLE
Run Code Online (Sandbox Code Playgroud)

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

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

lej*_*lot 49

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

x = { row.SITE_NAME : row.LOOKUP_TABLE for row in cursor }
Run Code Online (Sandbox Code Playgroud)

所以一般给出一些_container具有某种元素和功能的东西_value,对于给定的元素,它返回你想要添加到字典中的这个键的值:

{ _key : _value(_key) for _key in _container }
Run Code Online (Sandbox Code Playgroud)

  • 这是太棒了.我有一种感觉,这是堆栈上的冗余问题,但我找不到循环的名称,所以我的搜索没有找到我正在寻找的答案.这很好用.我还在最后输入了一个条件(x = {row.SITE_NAME:row.LOOKUP_TABLE用于游标中的行如果row.LOOKUP_TABLE <>无}非常赞赏lejlot和所有其他人! (3认同)

Way*_*ner 9

你正在使用的是一个列表理解.他们非常棒!)

他们有一个叫做生成器表达式的堂兄,它的工作方式类似于列表理解,但它不是一次构建列表,而是一次生成一个项目.因此名称生成器.您甚至可以构建作为生成器的函数 - 但是有很多问题和站点可以覆盖这些信息.

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

x = dict(((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor))
Run Code Online (Sandbox Code Playgroud)

或者,如果你有一个足够新的Python版本,就会有一种称为字典理解的东西 - 它的作用类似于列表理解,但却会生成一个字典.

x = {row.SITE_NAME : row.LOOKUP_TABLE for row in cursor}
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下,"一个足够新的Python版本"意味着2.7+对于那些使用<2.7的人来说,第一个选项似乎是唯一可用的选项. (2认同)

Car*_*ten 6

你可以这样做:

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)
Run Code Online (Sandbox Code Playgroud)