【问题标题】:Python: iterating over subset of dictionaryPython:迭代字典的子集
【发布时间】:2013-08-14 18:58:54
【问题描述】:

我想遍历字典的子集以找到子集中的最小值。我可以使用生成器表达式来获取值:

>>> S = {'a', 'c'}
>>> D = {'a': 2, 'b': 0, 'c': 1, 'd': 3}
>>> min(D[k] for k in S)
1

要获取关联的密钥,我想这是可能的:

>>> subset_min = min(D[k] for k in S)
>>> [k for k, v in D.iteritems() if v == subset_min]
['c']

但肯定有一种方法不需要再次搜索字典吗?我希望像min(D, key=D.get) 那样讨论here,但我不知道如何在这种情况下应用它。

【问题讨论】:

  • 如果有两个键的最小值,你需要它们两个,还是任何一个就足够了?

标签: python dictionary iterator generator


【解决方案1】:
min(S, key=D.get)

出乎意料的简单。

【讨论】:

  • 你也可以D[min(S, key=D.get)]
  • @drewk:当然,如果您只想要值,但问题是如何获取密钥。
  • 哇,非常好。当它比我在 Python 中预期的更简单时,我正在学习不要太惊讶。我可以为涉及值的更一般的表达式做类似的事情吗,例如找到最小化2*D[k]+1 的密钥?或者 unutbu 的答案会给出最好的方法吗?
  • min(S, key=lambda k: 2*D[k]+1)lambda 用途广泛,但通常有更好的方法。 (请注意,在这种情况下,最小化 D[k] 会最小化 2*D[k]+1,因此您仍然可以使用 key=D.get。)
【解决方案2】:
min_val, min_key = min((D[k], k) for k in S)

这会给你一个与最小值相关联的键,但它不会告诉你是否有多个这样的键。

或者,您可以先找到键,然后访问关联的值:

min_key = min(S, key=D.get)
min_val = D[min_key]

如果您想收集与subset_min 关联的D 中的所有键,那么您将让它遍历所有D,就像您发布的那样。

【讨论】:

  • key 是一个仅限关键字的参数。
猜你喜欢
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2017-05-30
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多