【问题标题】:How to know key in hash by value?如何按值知道哈希中的键?
【发布时间】:2011-07-12 19:04:11
【问题描述】:

我有哈希:

test = {
    'a': ['localhost'],
    'b': ['bb','aa'],
    'c': ['cc']
}

例如,我想知道 bb 的密钥? (b)。

【问题讨论】:

标签: python


【解决方案1】:

除了遍历键和值之外,没有其他简单的方法可以做到这一点。如果您经常需要这样做,那么将反向映射构建为一次性是值得的,因此您可以查找:

from collections import defaultdict

reversed_test = defaultdict(set)
test = { 'a': ['localhost'], 'b': ['bb','aa'], 'c': ['cc'] }

for k, v in test.items():
    for i in v:
        reversed_test[i].add(k)

print reversed_test['bb']

reversed_test 字典将诸如'bb' 之类的键映射到一组字符串,这些字符串最初映射到包含'bb' 的列表。这比Space_C0wb0y's neat solution 简洁得多,因为我假设test 可能看起来像:

{'a': ['foo','bar','foo'], 'b': ['foo','quux'] }

换句话说:

  • 多个键可能映射到包含'foo' 的列表
  • 'foo' 可能会在一个列表中出现多次。

【讨论】:

    【解决方案2】:

    一般你可以像这样构造一个反向字典:

    test_reversed = dict((v, k) for k, values in test.iteritems() for v in values)
    

    【讨论】:

    • 不适用于 python v3+... 将是 test.items() 而不是 test.iteritems()
    【解决方案3】:

    假设只有一个键匹配,你可以使用

    key = next(k for k in test if "bb" in test[k])
    

    这会遍历所有键,直到分配的列表包含您要查找的内容。此操作的效率远低于按键查找,而这正是字典的用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 2016-02-06
      • 1970-01-01
      • 2019-09-08
      • 2016-09-19
      • 2016-06-27
      • 2010-10-20
      • 2012-11-21
      相关资源
      最近更新 更多