比如说我有一个7个数字的列表,我们称之为'lineA',我下面有50行数字,我想看看'lineA'是否与我的50行完全匹配。什么是最快(时间)/最有效的方式?一个循环?还是其他方法?
lineA = [1,2,3,4,5,6,7]
lineTwo = [1,33,40,44,45,1,2]
lineThree = [2,13,22,41,50,8,9]
lineFour = [1,2,3,4,5,6,7]
lineFive = etc.....(repeat this 50 times)
谢谢
答案 0 :(得分:2)
您可以将两个列表与==
运算符进行比较:
if lineA == lineOne:
print 'they match!'
现在,将所有行保留在列表中:
lines = [lineOne, lineTwo, lineThree, ..., lineFifty]
然后找到匹配的行:
matches = [line for line in lines if line == lineA]
与比较每一行(O(n)
)相比,你无法获得更高的效率。 除非您首先对输入进行排序。然后,您可以使用bisect
模块并获得O(log n)
表现。如果您想将lineB, lineC, lineZ
与lines
进行比较,请执行此操作。否则不要打扰,因为排序基本上会比较O(n * log n)
...
答案 1 :(得分:2)
首先,创建一个包含所有列表的列表。
lines = [lineOne, lineTwo, ..., lineFifty]
然后您可以使用以下内容:
outs = [ind for ind,val in enumerate(lines) if val == lineA]
这种理解是O(n)
我相信,因为它只检查lines
中的每个值一次。 outs
现在会告诉您lines
包含等于lineA
的列表的位置。此外,它是一个单行,快速写入'你可以得到。使用索引可以计算出哪个line
匹配。
答案 2 :(得分:0)
Numpy array_equal应该能够改善运行时间,而不是其他任何说法;坦率地说,你不能比在词典上比较元素,即list ==运算符所做的更好。除非这是一个流式列表,否则你会忽略其他一些方面。
我的非常慢速计算机的基准测试:您应该能够获得更大的差异
import timeit
testeq= """\
a = [ range(randint(0,10),100) for x in xrange(500)]
b = range(5,100)
c = [list for list in a if list==b ]
"""
testnpeq= """
a = numpy.array([ range(randint(0,10),100) for x in xrange(500)])
b = numpy.array(range(5,100))
c = numpy.where(array_equal(a,b))
"""
print 'using == operator', timeit.timeit(testeq, setup="from random\
import randint", number = 10000)
print 'using np operator', timeit.timeit(testeq, setup="from random\
import randint\nimport numpy as np", number = 10000)
使用==运算符13.5805370808
使用np运算符12.8217720985
注意:两者都使用不同的随机数组。如果使用相同的数组,则应该获得更快的运行时间。
tl; dr只能通过词汇方式进行比较;使用numpy / C