我有两个列表,我想比较每个列表中的值,看差异是否在一定范围内,并返回每个列表中相同值的个数。这是我的代码第一个版本:
m = [1,3,5,7]
n = [1,4,7,9,5,6,34,52]
k=0
for i in xrange(0, len(m)):
for j in xrange(0, len(n)):
if abs(m[i] - n[j]) <=0.5:
k+=1
else:
continue
输出是 3。我也试过第二个版本:
for i, j in zip(m,n):
if abs(i - j) <=0.5:
t+=1
else:
continue
输出为1,答案错误。所以我想知道第一个版本是否有更简单、更高效的代码,我有大量数据要处理。谢谢!
请您参考如下方法:
您可以做的第一件事是删除 else: continue,因为它不会添加任何内容。此外,您可以直接使用 for a in m 来避免遍历范围和索引。
如果你想写得更简洁,你可以使用itertools .
import itertools
m = [1,3,5,7]
n = [1,4,7,9,5,6,34,52]
k = sum(abs(a - b) <= 0.5 for a, b in itertools.product(m, n))
这个(和你的解决方案)的运行时间是 O(m * n),其中 m 和 n 是列表。
如果你需要一个更高效的算法,你可以使用像二叉树或排序列表这样的排序数据结构来实现更好的查找。
import bisect
m = [1,3,5,7]
n = [1,4,7,9,5,6,34,52]
n.sort()
k = 0
for a in m:
i = bisect.bisect_left(n, a - 0.5)
j = bisect.bisect_right(n, a + 0.5)
k += j - i
运行时间为 O((m + n) * log n)。这是用于排序的 n * log n 和用于查找的 m * log n。因此,您希望使 n 成为较短的列表。
