【问题标题】:get keys from specific value in dictionary [closed]从字典中的特定值获取键[关闭]
【发布时间】:2017-12-14 17:24:11
【问题描述】:

如何获取字典中包含特定值的所有键?

例如:- 这是包含简单数据的字典。

{'h':['123,'4'], 'm':['456':'4'], 'a':['123,'4']}

如果我输入值 4,则打印所有包含该数字的键。 这是输出。

{'h', 'm', 'a'}

【问题讨论】:

  • 你尝试过什么,它到底有什么问题?另请注意,您的输出似乎是一个 set,它(如字典)不是有序的数据结构 - 尚不清楚您是否期望这种行为。
  • 看起来输出应该是一个列表
  • @Tadhg:不太一样,因为那是在寻找平等,而这是在寻找包容。
  • 好的,但唯一改变的是使用in而不是==

标签: python dictionary computer-science


【解决方案1】:

由于您的结果是一个集合,我会使用 set constructor

由于您的集合的值取决于您的输入数据的迭代,我会将generator expression 传递给集合构造函数。

search_term = '4'
data = {'h':['123','4'], 'm':['456','4'], 'a':['123','4']}
result = set(k for k,v in data.items() if search_term in v)
assert result == {'h', 'm', 'a'}

【讨论】:

  • 既然集合的元素是字典中的键,那么列表还不够吗(因为我们知道元素是唯一的)?
  • 我想是的,是的。但是OP的问题清楚地显示了一个集合作为结果。
  • @pault 为什么你更喜欢一组独特元素的列表?
  • @TadhgMcDonald-Jensen 只是问。我最初认为集合与列表可能会有一些额外的开销,但似乎并非如此。
【解决方案2】:

如果没有循环呢?

每个人都会给你循环解决方案,让我们尝试一些不同的东西:

数据是:

your_data = {'h':['123','4'], 'm':['456','4'], 'a':['123','4']}

一行没有循环:

print(set(filter(lambda y:y,map(lambda x:x if '4' in your_data.get(x) else None,your_data))))

输出:

{'a', 'm', 'h'}

最好的方法是使用函数:

def search_values(x,dict_data):
    final_list=[]
    for key,value in dict_data.items():
        if x in value:
            final_list.append(key)

    return set(final_list)

print(search_values('4',your_data))

输出:

{'a', 'm', 'h'}

【讨论】:

  • 只有当所有键都包含搜索词时,您的单行才能工作,否则结果中包含None
  • @TadhgMcDonald-Jensen 我已经修好了。看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2016-05-07
  • 2017-07-27
相关资源
最近更新 更多