Skip to main content
 首页 » 编程设计

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

2025年05月04日20JeffreyZhao

在下面的代码中,我无法理解变量 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 , 足以让您理解这些概念,并在将来看到使用它时识别语法,然后您可以返回并更详细地阅读。