2016-04-04 24 views
1

有没有办法在python中比较列表中的2个序列,即使它们没有标准化(我认为这是正确的词)。例如:比较序列Python

a = [1,1,2,3,3,1,5] 
b = [2,3,3,1,5,1,1] 
c = [1,1,1,2,3,3,5] 

a == b应返回true,因为它们只包含从不同的出发点相同的序列。

c == a应该返回false,尽管它们包含相同的元素,它们不包含相同的序列

我所能的事情是相当不雅的唯一的事。我会比较2个列表,如果它们不相等,则将列表的最后一个元素移到前面并再次比较。重复此操作,直到我将整个列表移动一次。不过,我会用一些非常大的列表来工作,所以这将是非常低效的

回答

1

这可能是比换挡元件更高效:

>>> a = [1, 1, 2, 3, 3, 1, 5] 
>>> b = [2, 3, 3, 1, 5, 1, 1] 
>>> c = [1, 1, 1, 2, 3, 3, 5] 
>>> astr, bstr, cstr = ["".join(map(str, x)) for x in (a, b, c)] 
>>> astr in bstr*2 
True 
>>> cstr in astr*2 
False 

它做什么基本上join列表为字符串,并检查是否第一个字符串包含在另一个'加倍'中。
使用字符串可能是最快的,应该适用于OP等简单情况。作为更一般的方法,您可以将相同的想法应用于列出切片,例如:

>>> any(idx for idx in range(len(a)) if (b*2)[idx:idx+len(a)] == a) 
True 
+0

谢谢,解决方案的工作速度更快 –