在下面的代码中,我无法理解变量 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()
}
请您参考如下方法:
这是一个 dict comprehension .它根据指定的表达式创建字典。 {...} 等同于 Python 中的 dict(...) 语法。 (在这种特殊情况下,它专门从 iterable 创建一个 dict(iterable);见底部)。
好的,那么所有这些 Python 术语是什么意思?首先,考虑一个 list comprehension在 Python 中,这是一个根据给定输入创建 列表 的表达式,例如:
odd_numbers = [ n for n in range(100) if n%2 == 1 ]
类似地,让我们从最基本的字典理解开始:
{ k: v for k, v in ... }
并注意 RHS match.groupdict().items() 是一个可迭代的,我们只是迭代正则表达式匹配的输出,作为字典项。 (让我们在后面为 RHS 编写 ...,以尽量减少困惑)。
接下来,添加 v if v else '' is a conditional expression在 Python 中,这里它只处理 value 之一为 None 的情况,并给出空字符串 '' 而不是 None(如果你试图做进一步的字符串,它会(恼人地)抛出异常 -对其进行处理,大概我们不想在每次尝试处理字符串 value 时都编写 try...except)。正如您所说,条件表达式中的 if 先于定义它们的可迭代对象,这让 Python 中的新用户有点不知所措。第一次看到它时,它看起来像是一堆顺序错误的关键字:) (推导式、条件表达式以及它们的组合和嵌套的组合使 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) 信息会有所帮助您了解这段代码正在从 iterable 创建一个 dict(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
| ...
杂项提示:
- 格式化:不要将大括号格式化成单独的一行,就好像它们是 C/C++/Java 复合语句 block 一样,Python 根本不那样使用大括号,我们很自豪其中:)。在 Python 中,
{...}等同于dict(...)。因此,每当您看到大括号时,您就是在查看字典、嵌套字典、列表字典、JSON 表达式等...... - ... 或者
set。set本质上是一个有键但没有值的字典,例如{'b', 'f', 'g'}。你也可以有一个 set comprehension ,除了{ k: v for k, v ... }它只是{ k for k in ... }。下面是一个示例:odd_numbers = { n for n in range(100) if n%2 == 1 }。在集合中,顺序无关紧要,这与元组不同。 - 周围没有空格:我在
[ ... ]或{ ... }周围写了 dict、list 和 set comprehensions,但那只是为了清楚地解释语法。 Pythonic (PEP-8) 方式是不写空格。 - 简洁:在字典理解中通常给
key、value非常短或一个字母的名称{ k: v for k, v in .. ., 特别是如果它们是复杂的表达式,那么您就不会重复浪费空间并需要大量或环绕的线条。 - 相关问题:Create a dictionary with list comprehension , How to use if/else in a dictionary comprehension?
- 另请浏览 Python Programming FAQ和 Functional Programming HOWTO , 足以让您理解这些概念,并在将来看到使用它时识别语法,然后您可以返回并更详细地阅读。
