在分配变量值之前仍使用的变量值仍然有效,这种{k:v for k,v in ...}语法如何工作?

时间:2019-07-04 06:27:53

标签: python dictionary-comprehension

在下面的代码中,我无法理解变量fieldvalue的使用方式,因为它们是在for循环的下一行中分配的。

我以这种语法和示例查看了for,但是找不到任何有用的东西可以解释这种行为。

match = re.search(someregx, some_text)
current_row = {
    field: value.strip() if value else '' for field, value in match.groupdict().items()
}

2 个答案:

答案 0 :(得分:3)

这是dict comprehension。它根据指定的表达式创建一个字典。 {...}与Python中的dict(...)等价。 (在这种情况下,它是专门根据dict(iterable)创建一个iterable;请参见底部。)

那么,所有这些Python行话是什么意思?首先,考虑一下Python中的list comprehension,该表达式是根据给定输入创建 list 的表达式,例如:

odd_numbers = [ n for n in range(100) if n%2 == 1 ] 

类似地,让我们从最基本的 dict理解开始:

{ k: v for k, v in ... } 

请注意, RHS match.groupdict().items()是可迭代的,我们只是将正则表达式匹配的输出作为字典项进行迭代。 (下面为RHS写...,以尽量减少混乱)。

接下来,在Python中添加v if v else ''conditional expression,在这里它只处理value之一为None的情况,并给出空字符串”而不是None (如果您尝试对其进行进一步的字符串处理,这将(令人讨厌)抛出异常,并且大概我们不想在每次尝试处理字符串try...except时都必须写value )。如您所说,它使Python中的新用户有点拥挤,条件表达式中的if在定义它们的可迭代对象之前。第一次看到它时,它看起来像是关键字顺序错误的汤:) (综合理解,条件表达式以及对它们进行组合和嵌套的结合,使Python在紧凑的同时真正具有表现力。)

因此我们正在查看:

{ k: v if v else '' for k, v in ... } 

或者在这种情况下,并调用键变量field

{ field: value.strip() if value else '' for field, value in match.groupdict().items() }

一旦您知道{...}等同于dict(...)help(dict)信息将帮助您了解此代码是根据{{1} } dict(iterable)的语法中,下面显示的第三种情况:

iterable

其他提示:

  • 格式化:不要将花括号格式化为C / C ++ / Java复合语句块,Python根本不使用这样的花括号,我们为此感到非常自豪其中:)。在Python中,dict(...)等效于class dict(object) | dict() -> new empty dictionary | | dict(mapping) -> new dictionary initialized from a mapping object's | (key, value) pairs | | dict(iterable) -> new dictionary initialized as if via: | d = {} | for k, v in iterable: | d[k] = v | ... 。因此,每当您看到花括号时,您都在查看字典,嵌套字典,列表字典,JSON表达式等。
  • ...否则为{...}dict(...)本质上是一个有键但没有值的字典,例如set。您还可以拥有一个set comprehension,只是set代替了{'b', 'f', 'g'}。这是一个示例:{ k: v for k, v ... }。在集合中,顺序不重要,与元组不同。
  • 没有周围的空格:我写了dict,list并设置了{ k for k in ... }odd_numbers = { n for n in range(100) if n%2 == 1 }周围的空格的理解,但这只是为了解释语法。 Pythonic(PEP-8)的方式是不写空格。
  • 简洁:dict理解中的惯例是给[ ... ]{ ... }非常短或一个字母的名称key,尤其是。如果它们是复杂的表达式,那么您就不必重复浪费空间,而无需使用大行或换行。
  • 相关问题:Create a dictionary with list comprehensionHow to use if/else in a dictionary comprehension?
  • 也请略读Python Programming FAQFunctional Programming HOWTO,以使您理解概念,并在以后看到语法时再识别该语法,然后可以回头阅读更多内容。细节。

答案 1 :(得分:2)

这是字典理解,相当于

current_row = {}
for field, value in match.groupdict().items():
    if value:
        current_row[field] = value.strip()
    else:
        current_row[field] = ''