2016-04-04 94 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

謝謝,解決方案的工作速度更快 –