问题描述
我有一本这样格式的字典
d = {
"Fruit_1" : ["mango", "apple"],
"Fruit_2" : ["apple"],
"Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"]
}
我将一个值作为“芒果”传递,并且我想获取所有只出现芒果的对应键。 我无法在值发生的地方获得相应的键。
1楼
迭代d.items
并检查mango
是否存在值。
In [21]: [key for key,value in d.items() if 'mango' in value]
Out[21]: ['Fruit_1', 'Fruit_3']
2楼
你也许可以这样做:
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)
3楼
幼稚的方法(遍历所有项目并寻找结果)有效但具有很高的复杂性,主要是在您必须执行大量请求时。
您可以通过用一set
替换list
值来稍微改进它(为了更快in
查找),但这仍然会很慢( O(n**2)
=> 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"])
这是重建的字典:
defaultdict(<class 'list'>, {'apple': ['Fruit_2', 'Fruit_3', 'Fruit_1'], 'orange': ['Fruit_3'], 'banana': ['Fruit_3'], 'kiwi': ['Fruit_3'], 'mango': ['Fruit_3', 'Fruit_1']})
这是对“芒果”的查询:
['Fruit_3', 'Fruit_1']
4楼
像这样?
>>> 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']
这个想法是迭代 (key, value) 项对并检查每个值是否存在'mango'
。
如果是,请保留密钥。
由于您不熟悉 Python,这里是传统的for
循环逻辑:
>>> result = []
>>> for key, value in d.items():
... if 'mango' in value:
... result.append(key)
...
>>> result
['Fruit_1', 'Fruit_3']
5楼
对于单个查询,您可以使用列表理解。 每次搜索值时,这将具有 O( n ) 时间复杂度:
res = [k for k, v in d.items() if 'mango' in v]
对于多个查询,您可以通过一次性 O( n ) 成本使用set
对象的defaultdict
:
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']
提取相关键。