我有以下代码行:
food_web = {'Limpets ': [' Seaweed'],'Zooplankton ': ['Phytoplankton'],'Fish':[' Prawn'],'Whelk ': [' Limpets', ' Mussels'],'Lobster ': [' Crab', ' Mussels', ' Limpets', ' Whelk']}
我想确定一个顶点捕食者,这意味着一个键没有出现在字典的任何值中,所以我需要搜索所有值中的每个键,但我不知道如何处理这个。这些价值列表也让我感到困难。我只是在学习python,所以我的知识可能会低于标准。
答案 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()
获取所有参数并将它们组合成一组。星号unpacks将food_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。因此,此表达式返回键的集合,其中没有任何键存在于给定字典的值中。