a = [1, 2, 9, 5, 1]
b = [9, 8, 7, 6, 5]
Run Code Online (Sandbox Code Playgroud)
我想计算两个列表之间重复的数量.因此,使用上面的内容,我想返回2的计数,因为9和5对于两个列表都是通用的.
我试过这样的东西,但它没有用.
def filter_(x, y):
count = 0
for num in y:
if num in x:
count += 1
return count
Run Code Online (Sandbox Code Playgroud)
use*_*312 23
更短的方式和更好的:
>>> a = [1, 2, 9, 5, 1]
>>> b = [9, 8, 7, 6, 5]
>>> len(set(a) & set(b)) # & is intersection - elements common to both
2
Run Code Online (Sandbox Code Playgroud)
为什么你的代码不起作用:
>>> def filter_(x, y):
... count = 0
... for num in y:
... if num in x:
... count += 1
... return count
...
>>> filter_(a, b)
2
Run Code Online (Sandbox Code Playgroud)
你return count在for循环中,它返回而没有执行完成.
你可以使用set.intersection:
>>> set(a).intersection(set(b)) # or just: set(a).intersection(b)
set([9, 5])
Run Code Online (Sandbox Code Playgroud)
或者,对于交叉点的长度:
>>> len(set(a).intersection(set(b)))
2
Run Code Online (Sandbox Code Playgroud)
或者,更简洁:
>>> len(set(a) & set(b))
2
Run Code Online (Sandbox Code Playgroud)
如果您希望计算多项条目,则基于集合的解决方案将失败; 你会需要类似的东西
from collections import Counter
def numDups(a, b):
if len(a)>len(b):
a,b = b,a
a_count = Counter(a)
b_count = Counter(b)
return sum(min(b_count[ak], av) for ak,av in a_count.iteritems())
Run Code Online (Sandbox Code Playgroud)
然后
numDups([1,1,2,3], [1,1,1,1,1])
Run Code Online (Sandbox Code Playgroud)
返回2.此时的运行时间为O(n + m).
另外,您的初始解决方案
for num in y:
if num in x:
count += 1
Run Code Online (Sandbox Code Playgroud)
错误 - 适用于[1,2,3,3]和[1,1,1,1,1,3],您的代码将返回3或6,两者都不正确(答案应为2).
| 归档时间: |
|
| 查看次数: |
11601 次 |
| 最近记录: |