在下面的代码中,我无法理解变量field
和value
的使用方式,因为它们是在for
循环的下一行中分配的。
我以这种语法和示例查看了for
,但是找不到任何有用的东西可以解释这种行为。
match = re.search(someregx, some_text)
current_row = {
field: value.strip() if value else '' for field, value in match.groupdict().items()
}
答案 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
其他提示:
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 ... }
。在集合中,顺序不重要,与元组不同。{ k for k in ... }
或odd_numbers = { n for n in range(100) if n%2 == 1 }
周围的空格的理解,但这只是为了解释语法。 Pythonic(PEP-8)的方式是不写空格。[ ... ]
,{ ... }
非常短或一个字母的名称key
,尤其是。如果它们是复杂的表达式,那么您就不必重复浪费空间,而无需使用大行或换行。答案 1 :(得分:2)
这是字典理解,相当于
current_row = {}
for field, value in match.groupdict().items():
if value:
current_row[field] = value.strip()
else:
current_row[field] = ''