如何从值中获取字典中的所有键?

时间:2018-10-04 09:09:00

标签: python json python-2.7 dictionary

我有这样格式的字典

d = {
    "Fruit_1" : ["mango", "apple"],
    "Fruit_2" : ["apple"],
    "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"]
}

我传递的值是“ mango”,我想获取仅芒果出现的所有对应键。我无法在出现值的地方获取相应的键。

5 个答案:

答案 0 :(得分:7)

迭代d.items并检查mango的值是否存在。

In [21]: [key for key,value in d.items() if 'mango' in value]
Out[21]: ['Fruit_1', 'Fruit_3']

答案 1 :(得分:2)

幼稚的方法(遍历所有项目并寻找结果)有效,但复杂度很高,主要是在您必须执行大量请求的情况下。您可以通过将list的值替换为set(以实现更快的in查找)来稍微改善它,但这仍然很慢(O(n**2) => {{1} },但仍有改进的空间。

如果您希望能够多次执行这些查询,则最好重建字典,这样一旦使用O(n)

即可快速查找。

collections.defaultdict

这是重建的字典:

d = {
    "Fruit_1" : ["mango", "apple"],
    "Fruit_2" : ["apple"],
    "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"]
}

import collections

newd = collections.defaultdict(list)

for k,vl in d.items():
    for v in vl:
        newd[v].append(k)

print(newd)
print(newd["mango"])

这是对“ mango”的查询:

defaultdict(<class 'list'>, {'apple': ['Fruit_2', 'Fruit_3', 'Fruit_1'], 'orange': ['Fruit_3'], 'banana': ['Fruit_3'], 'kiwi': ['Fruit_3'], 'mango': ['Fruit_3', 'Fruit_1']})

答案 2 :(得分:1)

喜欢吗?

>>> d = {
...     "Fruit_1" : ["mango", "apple"],
...     "Fruit_2" : ["apple"],
...     "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"]
... }
>>> 
>>> [key for key, value in d.items() if 'mango' in value]
['Fruit_1', 'Fruit_3']

这个想法是迭代(键,值)项对,并检查每个值是否存在'mango'。如果是,请保留密钥。

由于您是Python新手,因此这里是传统的for循环逻辑:

>>> result = []
>>> for key, value in d.items():
...     if 'mango' in value:
...         result.append(key)
... 
>>> result
['Fruit_1', 'Fruit_3']

答案 3 :(得分:1)

您也许可以这样做:

d = {
    "Fruit_1" : ["mango", "apple"],
    "Fruit_2" : ["apple"],
    "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"]
}

# list comprehension
mango_keys = [fruit for fruit in d.keys() if "mango" in d[fruit]]
print(mango_keys)       


# ['Fruit_1', 'Fruit_3']         


# or more traditional for-loop (but non pythonic)

for fruit in d.keys():
    if "mango" in d[fruit]:
        print(fruit)

答案 4 :(得分:1)

对于单个查询,您可以使用列表推导。您每次搜索值时,每次( n )的时间复杂度为O( n ):

res = [k for k, v in d.items() if 'mango' in v]

对于多个查询,您可以通过一次性O( n )成本使用defaultdict个对象中的set个对象:

from collections import defaultdict

dd = defaultdict(set)

for k, v in d.items():
    for fruit in v:
        dd[fruit].add(k)

print(dd)

defaultdict({'mango': {'Fruit_1', 'Fruit_3'},
             'apple': {'Fruit_1', 'Fruit_2', 'Fruit_3'},
             'banana': {'Fruit_3'},
             'kiwi': {'Fruit_3'},
             'orange': {'Fruit_3'}})

然后您可以使用dd['mango']提取相关密钥。