我有两个清单。首先是三次旅行中每次出现的动物清单。其次是动物类型列表。
In [1]:
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
animal_types = ['cat', 'dog', 'mouse']
我希望看到动物的次数。在这种情况下:
seen_count = [3, 2, 1]
即,猫出现3次,狗出现2次,小鼠出现1次。
我的策略是遍历每种动物类型,并且对于每次旅行的每个循环,如果看到该动物类型,则添加1,然后将该值附加到名为seen_count的新列表。
这是我的代码:
In [2]:
seen_count = []
for animal in animal_types:
for seen in animals_seen:
count = 0
if animal in seen:
count = count + 1
else:
count = count + 0
seen_count.append(count)
print(seen_count)
然而,输出没有意义:
Out[4]:
[1, 0, 0]
我做错了什么?有更简单的方法吗?
答案 0 :(得分:1)
这是defaultdict
的完美用途:
from collections import defaultdict
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
animal_types = ['cat', 'dog', 'mouse']
seen_count = defaultdict(int)
for animal in animal_types:
for seen in animals_seen:
if animal in seen:
seen_count[animal] += 1
print(seen_count)
给出:
{'mouse': 1, 'dog': 2, 'cat': 3}
答案 1 :(得分:1)
您的count = 0
位于内部循环中,这使得它忘记了之前的任何值。输出中唯一值为1的原因在于最后一个元素包含给定的动物。你需要在外部循环中初始化count
为0,但在内部循环之外。
答案 2 :(得分:0)
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
animal_types = ['cat', 'dog', 'mouse']
print([sum(animal in ele.split() for animal in animal_types) for ele in animals_seen])
[3, 2, 1]
如果你想要一个字典:
counts = (sum(animal in ele.split() for animal in animal_types) for ele in animals_seen)
print(dict(zip(animal_types, counts)))
{'mouse': 1, 'dog': 2, 'cat': 3}
使用您自己的代码,您需要将计数放在内部循环之外,您可以忘记其他:
seen_count = []
for animal in animal_types:
count = 0 # will start at zero for each animal
for seen in animals_seen:
if animal in seen.split(): # use split or cat in catch will be True
count += 1
seen_count.append(count)
答案 3 :(得分:0)
或多或少等同于以下内容,它使用模块Counter
中的collections
类
import collections
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
c = collections.Counter()
for seen in animals_seen:
c.update(seen.split())
# c.update(set(seen.split()))
输出:
c
Counter({'cat': 3, 'dog': 2, 'mouse': 1})
list(c.values())
[3, 1, 2]
list(c.keys())
['cat', 'mouse', 'dog']
主要区别在于您可以对任何动物进行计数,即使它之前未定义过。
编辑以回应PadraicCunningham: 如果动物每次旅行只计算一次,请使用注释掉的行。
答案 4 :(得分:0)
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
animal_types = ['cat', 'dog', 'mouse']
seen_count = [sum([each.count(animal) for each in animals_seen]) for animal in animal_types]
print seen_count
[3, 2, 1]
String's
内置 count
功能非常完美。
>>> 'cat dog mouse'.count('cat')
1
>>> 'cat dog mouse cat'.count('cat')
2
>>> 'cat dog mouse catcat'.count('cat')
3
答案 5 :(得分:0)
您的代码只找到animals_seen
的第三个元素和animal_types
的第一个元素。这是输出数字1。
这是因为'cat'
当然不等于'cat dog mouse'
。
我建议你在for循环中使用split函数。拆分功能的例子
seen="cat dog mouse"
seen.split()
['cat', 'dog', 'mouse']
这样您就可以将此函数的结果与所有animal_types进行比较。
答案 6 :(得分:0)
animals_seen = ['cat dog mouse', 'cat dog', 'cat']
animal_types = ['cat', 'dog', 'mouse']
seen = [0 for _ in animal_types]
for item in animals_seen:
for index, animal in enumerate(animal_types):
seen[index] += item.split(' ').count(animal)
print(seen)
输出
[3, 2, 1]