我有两个列表,我想比较每个列表中的值以查看差异是否在某个范围内,并返回每个列表中相同值的数量.这是我的代码第一版:
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
Run Code Online (Sandbox Code Playgroud)
输出是3.我也试过第二个版本:
for i, j in zip(m,n):
if abs(i - j) <=0.5:
t+=1
else:
continue
Run Code Online (Sandbox Code Playgroud)
输出为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))
Run Code Online (Sandbox Code Playgroud)
这样做的运行时间(和你的解决方案)是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
Run Code Online (Sandbox Code Playgroud)
运行时是O((m + n) * log n).那是n * log n为了排序和m * log n查找.所以你想要制作n更短的清单.