检查嵌套列表中是否存在值

时间:2009-03-16 22:41:51

标签: python

在我的列表中:

animals =  [ ['dog', ['bite'] ],
             ['cat', ['bite', 'scratch'] ],
             ['bird', ['peck', 'bite'] ], ]

add('bird', 'peck')
add('bird', 'screech')
add('turtle', 'hide')

add函数应该在将它们添加到列表之前检查动物和动作是否尚未添加。有没有办法在不将每个步骤的循环嵌入列表的情况下完成此操作?

6 个答案:

答案 0 :(得分:6)

您使用的是错误的数据类型。请使用dict代替set

def add(key, value, userdict):
    userdict.setdefault(key, set())
    userdict[key].add(value)

用法:

animaldict = {}
add('bird', 'peck', animaldict)
add('bird', 'screech', animaldict)
add('turtle', 'hide', animaldict)

答案 1 :(得分:4)

虽然可以构建一个通用函数,在动物中使用a.index或“dog”进行测试来查找列表中的动物,但是你真的想要一个字典,否则添加函数会因为更多的动物而变得非常粗略。加入:

animals = {'dog':set(['bite']),
           'cat':set(['bite', 'scratch'])}

然后,您可以使用setdefault“一次性”添加功能:

animals.setdefault('dog', set()).add('bite')

如果它不存在,它将创建'dog'键,并且由于setdefault返回存在或刚刚创建的集合,因此您可以添加咬合动作。设置确保不会自动重复。

答案 2 :(得分:4)

基于递归的解决方案,在Python 2.5或更新版本中,您可以使用defaultdict类,如下所示:

from collections import defaultdict

a = defaultdict(set)

def add(animal, behavior):
    a[animal].add(behavior)

add('bird', 'peck')
add('bird', 'screech')
add('turtle', 'hide')

答案 3 :(得分:0)

animals_dict = dict(animals)

def add(key, action):
    animals_dict.setdefault(key, [])
    if action not in animals_dict[key]:
        animals_dict[key].append(action)

(更新为使用setdefault - 很好的@recursive)

答案 4 :(得分:0)

你真的应该为此目的使用字典。或者类Animal

您可以像这样改进代码:

if not any((animal[0] == "bird") for animal in animals):
    # append "bird" to animals

答案 5 :(得分:0)

虽然我同意其他人的意见。您选择的数据结构,这是您的问题的答案:

def add(name, action):
    for animal in animals:
        if animal[0] == name:
            if action not in animal[1]:
                animal[1].append(action)
            return
    else:
        animals.append([name, [action]])

for循环是您数据结构的必然结果,这就是为什么每个人都建议您考虑使用词典。