如何在字典中搜索列表

时间:2015-11-30 18:48:23

标签: python list dictionary

我有以下代码行:

food_web = {'Limpets ': [' Seaweed'],'Zooplankton ': ['Phytoplankton'],'Fish':[' Prawn'],'Whelk ': [' Limpets', ' Mussels'],'Lobster ': [' Crab', ' Mussels', ' Limpets', ' Whelk']}

我想确定一个顶点捕食者,这意味着一个键没有出现在字典的任何值中,所以我需要搜索所有值中的每个键,但我不知道如何处理这个。这些价值列表也让我感到困难。我只是在学习python,所以我的知识可能会低于标准。

4 个答案:

答案 0 :(得分:5)

我有一个简洁的解决方案,但它只有在键和值是字符对字符相同的情况下才有效,所以你必须首先去除字符串开头和结尾的空格。

food_web = {
    'Limpets': ['Seaweed'],
    'Zooplankton': ['Phytoplankton'],
    'Fish': ['Prawn'],
    'Whelk': ['Limpets', 'Mussels'],
    'Lobster': ['Crab', 'Mussels', 'Limpets', 'Whelk']
}

print set(food_web.keys()) - set().union(*food_web.values())

结果:

set(['Zooplankton', 'Fish', 'Lobster'])

更多解释:set.union()获取所有参数并将它们组合成一组。星号unpacksfood_web.values()的元素放入各个参数中。减去两个集合给出了第一组中不包含在第二组中的所有项目的集合。

答案 1 :(得分:1)

最简单的方法可能是将所有值组合到一个列表中:

values = [item.strip() for subl in food_web.values() for item in subl]

让我们从内到外看这一行:

food_web.values()是字典中所有values的列表。所以这是一个列表清单。我想提取内部列表中的所有值,所以我要添加另一个“理解”:for item in subl。同时,这将获取food_web.values()中的每个子列表并提取每个元素。然后它将所有这些(单个)元素放回一个列表中。

我正在使用strip()命令删除额外的空格,这会使字符串比较更加困难。

然后,您可以检查此新列表中是否存在items

for kk in food_web.keys():
    if kk.strip() not in values:
        print("Apex: ", kk)

答案 2 :(得分:0)

创建一组所有值,剥离空白并迭代键也剥离并检查键是否在值集中:

from itertools import chain
vals = set(s.strip() for s in chain.from_iterable(food_web.values()))


for k in food_web:
    if k.strip() not in vals:
        print(k)

哪个输出:

Lobster 
Zooplankton 
Fish 

如果键和值没有额外的空格,你可以在python 2中使用dict.viewkeys或在python3中使用.keys

# food_web.keys()  python3
print(food_web.viewkeys() - chain.from_iterable(food_web.values()))

会给出:

set(['Lobster', 'Zooplankton', 'Fish'])

但这只适用于你不相同的字符串。

如果你想首先整理你的键和值,那么viewkeys可以工作,你将有一个更有效的内存解决方案:

for k,v in food_web.items():
    food_web[k] = [x.strip() for x in v]

print(food_web.viewkeys() - chain.from_iterable(food_web.values())) 

答案 3 :(得分:0)

[key1 for key1 in food_web if not any([key1 in value for key2, value in food_web.items()])]

以下是嵌套理解。 来自外部理解的键的存在正在内部检查。这将返回布尔值列表。仅当列表中的任何元素为true时,评估此列表上的任何函数都将返回true。因此,此表达式返回键的集合,其中没有任何键存在于给定字典的值中。