Python - 匹配列表的最有效方法

时间:2013-07-25 15:58:39

标签: python loops

比如说我有一个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)

谢谢

3 个答案:

答案 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, lineZlines进行比较,请执行此操作。否则不要打扰,因为排序基本上会比较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