两个列表中的两个值,简化代码

Nin*_*gxi 1 python

我有两个列表,我想比较每个列表中的值以查看差异是否在某个范围内,并返回每个列表中相同值的数量.这是我的代码第一版:

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,答案是错误的.所以我想知道第一版是否有更简单,更有效的代码,我有大量的数据需要处理.谢谢!

Pau*_*per 5

你可以做的第一件事是删除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),其中mn是列表的长度.


如果需要更高效的算法,可以使用排序数据结构(如二叉树或排序列表)来实现更好的查找.

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更短的清单.