【问题标题】:How does "&" work in comparing two type of data in this code?\"&\" 在这段代码中如何比较两种类型的数据?
【发布时间】:2022-11-27 01:48:42
【问题描述】:

我正在阅读 Python Cookbook:“1.17. Extracting a Subset of a Dictionary”。我对下面一段代码示例中的“&”用法感到困惑。谁能帮忙详细说说? prices.keys() & tech_names 在这里如何工作?
谢谢!
-Xiaokuan

  prices = {
             'ACME': 45.23,
             'AAPL': 612.78,
             'IBM': 205.55,
             'HPQ': 37.20,
             'FB': 10.75
  }
  tech_names = { 'AAPL', 'IBM', 'HPQ', 'MSFT' }
  p2 = { key:prices[key] for key in prices.keys() & tech_names }

【问题讨论】:

  • 它不像您期望的那样工作。这对我来说似乎是一个错误。开个解释器评估一下prices.keys() & tech_names
  • @PaulH 我不同意,它创建了一个字典,其中在pricestech_names 中都找到了密钥——这正是我阅读代码的方式。 prices.keys() & tech_names 返回 {'AAPL', 'HPQ', 'IBM'} ,再次完全符合预期。

标签: python


【解决方案1】:

& 运算符用于创建路口prices 中的键集和tech_names 中的值。

请参阅Dictionary view objects部分:

键视图类似于集合,因为它们的条目是唯一且可散列的。[...]对于类集合视图,为抽象基类 collections.abc.Set 定义的所有操作都可用(例如,==<^)。

另见intersection methods section for set

 set & other & ...

返回一个新集合,其中包含该集合和所有其他元素共有的元素。

因此,代码仅定义 tech_names 集合中列出的品种的价格。

另一种拼写方式是在字典理解中使用if过滤器;这样做的好处是您可以使用 prices.items() 同时访问代码和价格:

p2 = {symbol: price for symbol, price in prices.values() if symbol in tech_names}

【讨论】:

  • @Martijin,感谢您的及时回复并指出我正确的地方。我现在意识到键视图像数据一样设置,“&”可以是一个集合运算符(我只认为它是一个位运算符)
  • @XiaokuanWei:在Python 中,大多数运算符都可以重载。 Sets 实现(除其他外)__and__ method 以提供交集结果。
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
相关资源
最近更新 更多