-4

例如,我有一个包含 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)

谢谢

4

3 回答 3

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)...

于 2013-07-25T16:06:17.173 回答
2

首先,创建一个包含所有列表的列表。

lines = [lineOne, lineTwo, ..., lineFifty]

然后,您可以使用以下内容:

outs = [ind for ind,val in enumerate(lines) if val == lineA]

我相信这种理解,O(n)因为它只检查lines一次每个值。outs现在告诉你 wherelines包含一个等于 的列表lineA。另外,它是一种单行字,可以“快速书写”。使用索引,您可以找出line匹配的内容。

于 2013-07-25T16:15:23.093 回答
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

于 2013-07-25T16:11:39.127 回答