在我的列表中:
animals = [ ['dog', ['bite'] ],
['cat', ['bite', 'scratch'] ],
['bird', ['peck', 'bite'] ], ]
add('bird', 'peck')
add('bird', 'screech')
add('turtle', 'hide')
add函数应该在将它们添加到列表之前检查动物和动作是否尚未添加。有没有办法在不将每个步骤的循环嵌入列表的情况下完成此操作?
答案 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
循环是您数据结构的必然结果,这就是为什么每个人都建议您考虑使用词典。