如何为特定键返回字典值的常用值?

时间:2015-04-11 09:24:50

标签: python dictionary

我有一本字典,其中包含:

{'Key': ['File1', 'File2']}

其中key对应一个单词,files是包含该单词的文件集。

假设我有一本字典:

{'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
 'apple': ['file2.txt', 'file3.txt']}

我的查询是banana apple。如何以仅返回file2.txtfile3.txt

的方式比较值

3 个答案:

答案 0 :(得分:7)

您可以使用set.intersection创建公共元素,例如

>>> d = {'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
...      'apple': ['file2.txt', 'file3.txt']}
>>> words = 'banana apple'
>>> set.intersection(*(set(d[word]) for word in words.split() if word in d))
{'file2.txt', 'file3.txt'}

在这里,我们创建了一个生成器表达式,它获取与该单词对应的所有文件并将其转换为集合。然后我们unpack set.intersection函数上的genereator表达式,它找到所有集合的集合交集。

编辑:如果您的字典值确实已设置,正如您在问题中提到的那样

  

和文件是设置包含该字词

的文件

然后,解决方案可以更快,因为我们没有将列表转换为集合。您可以跳过它并执行

>>> set.intersection(*(d[word] for word in words.split() if word in d))
{'file2.txt', 'file3.txt'}

重要编辑

如果字典只有bananaapple不存在且输入为banana apple,该怎么办?如果你想在这种情况下返回一个空集,那么你只需稍微修改生成器表达式,就像这个

>>> set.intersection(*(set(d.get(word, set())) for word in words.split()))
{'file2.txt', 'file3.txt'}

这里,如果在字典中找不到密钥,我们使用dict.get方法返回默认值。所以,如果字典中没有apple,那么我们返回一个空集,使得结果为空集(因为当你用空集相交任何集时,结果将是一个空集)。 / p>

答案 1 :(得分:3)

迭代查询中的键并将结果汇​​总到set

data = {'banana' : ['file1.txt', 'file2.txt', 'file3.txt'],
        'apple' : ['file2.txt', 'file3.txt']}
query = "banana apple"

result = None
for key in (k for k in query.split() if k in data):
    if result is None:
        result = set(data[key])
    else:
        result &= set(data[key])    

答案 2 :(得分:0)

通过构建给定dict的镜像或反向映射,这是一种简单的方法。这个反向字典中的键,包含query中的所有项目,作为它们对应的值将是我们想要的。

d1 = {'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
 'apple': ['file2.txt', 'file3.txt']}

d2 = {}
query = 'banana apple'
for (k, lst) in d1.items():
    for l in lst:
      d2.setdefault(l, []).append(k)
print filter(lambda y: all([x in d2[y] for x in query.split()]), d2.keys())