计算时间从一个列表中的每个值出现在第二个列表中

时间:2014-12-06 19:15:24

标签: python

我有两个清单。首先是三次旅行中每次出现的动物清单。其次是动物类型列表。

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]

我做错了什么?有更简单的方法吗?

7 个答案:

答案 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]