计算python第二个列表中列表项的出现

时间:2019-04-23 11:06:50

标签: python python-3.x list python-3.6

a = list([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
b = list([1, 3, 6, 9])

如何计算列表中某项在列表a中出现的次数?

上面的示例应返回值4。

在撰写此问题时,我想到了以下内容(看来可行)

a = list([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
b = list([1, 3, 6, 9])
c = 0
for n in b:
    if n in a:
        c += 1
        continue
print (c)

但是使用列表比较或其他方法一定有更整洁的方法吗?

7 个答案:

答案 0 :(得分:6)

您可以使用内置的sum

sum(i in b for i in a)

输出:

4

答案 1 :(得分:3)

使用set的简单方法:

>>> len(set(a) & set(b))
4

这是一个古老的问题,请看一下: How can I compare two lists in python and return matches

答案 2 :(得分:2)

如果您只想计算两个列表中的元素数量(并且您不需要知道它们在另一个列表中出现的次数),则可以使用:

count = len(set(a).intersection(set(b)))

或完全相同:

count = len(set(a) & set(b))

答案 3 :(得分:2)

只需一行即可尝试:

s = sum(a.count(i) for i in b if i in a)

s将作为4作为输出。 此外,它支持a中的重复项。

答案 4 :(得分:2)

这里有一些变种,它们计算重复项并忽略b中没有的所有值。

from collections import Counter
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
a = [1, 4, 3, 1, 2, 4, 4, 5, 6, 6, 7, 7, 7, 7, 8, 9, 0, 1]
b = [1, 3, 6, 9]

counts = Counter()
# make counts order match b order
for item in b:
    counts[item] = 0
for item in a:
    if item in b:
        counts[item] += 1
print("in 'b' order")
print([(k, v) for k, v in counts.items()])
print("in descending frequency order")
print(counts.most_common())
print("count all occurrences in a of elements that are also in b")
print(sum(counts.values()))



python count_b_in_a.py
in 'b' order
[(1, 3), (3, 1), (6, 2), (9, 1)]
in descending frequency order
[(1, 3), (6, 2), (3, 1), (9, 1)]
count all occurrences in a of elements that are also in b
7

回应您对性能的评论,以下是在Python中扫描列表和扫描集合之间的比较:

import datetime

def timestamp():
    return datetime.datetime.now()


def time_since(t):
    return (timestamp() - t).microseconds // 1000


a = list(range(1000_000))
b = set(a)
iterations = 10
t = timestamp()
for i in range(iterations):
    c = 974_152 in a
print("Finished {iterations} iterations of list scan in {duration}ms"
      .format(iterations=iterations, duration=time_since(t)))
t = timestamp()
for i in range(iterations):
    c = 974_152 in b
print("Finished {iterations} iterations of set scan in {duration}ms"
      .format(iterations=iterations, duration=time_since(t)))

python scan.py
Finished 10 iterations of list scan in 248ms
Finished 10 iterations of set scan in 0ms

首先要注意的是:Python都不差劲。在旧笔记本电脑上扫描1/4秒以扫描1000万个列表元素也不错。但这仍然是线性扫描。

Python集位于不同的类中。如果您从// 1000中取出time_since(),您会发现Python在1微秒内扫描了100万个成员集10次。您会发现其他设置操作也很快。凡在Python中应用设置的地方,请使用它们:它们很棒。

如果您打算将上述代码应用于更大的列表,那么性能就很重要,那么要做的第一件事可能就是将b转换为集合。

答案 5 :(得分:1)

这种单线也应该工作。找到每个元素的计数并将这些计数加起来

op = sum([a.count(j) for j in b])

输出将是

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
b = [1, 3, 6, 9]
#4
a = [1, 1, 2, 3, 3, 3, 4, 5, 6, 6 , 7, 8, 9, 0]
b = [1, 3, 6, 9]
#8

答案 6 :(得分:0)

虽然 set 适用于唯一性

列表理解也考虑重复

a = [1,1]
b = [1,1]

count = len(set(a) & set(b)) 
count2 = sum(i in b for i in a)  
print(count, count2) 
1 2

[Program finished]