2014-01-26 41 views
1

你好,我想要一個名單與Python的另一個列表,其中的元素序列好好嘗試一下事項Python的元組進行比較

list=[1,2,3] 

應等於list2=[3,2,1]和等於list3=[3,1,2]等。我想動態地這樣做,因爲我不知道列表中有多少元素?有沒有快速的方法來做到這一點?我想出的唯一方法是在每個列表中搜索另一個列表的元素,但這有O(n^2)。此外,我無法排序列表,因爲在我的實施中,列表是列表的列表。我只想回答簡單版本的問題,然後修改它!你可以幫我嗎?

+1

不幸的是,最簡單的解決辦法可能_still_是與內部列表進行排序一個自定義的排序鍵。 –

+0

你可能也想看看這個:http://stackoverflow.com/questions/21029678/undirected-tuple-comparison – fedorSmirnov

回答

4

您可以將列表簡單地轉換成集,然後簡單地檢查它們是否相等

list1, list2, list3 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4] 
print set(list1) == set(list2) # True 
print set(list2) == set(list3) # False 
print set(list1) == set(list3) # False 

如果你想確保元素只存在相同數量的倍於其他列表中,你可以使用collections.counterThanks @delnan),這樣

list1, list2, list3, list4 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4], [1, 2, 3, 3] 
from collections import Counter 
print Counter(list1) == Counter(list2) # True 
print Counter(list2) == Counter(list3) # False 
print Counter(list1) == Counter(list3) # False 
print Counter(list1) == Counter(list4) # False 
+2

這不起作用,如果他試圖[1,2,3]與[1, 2,3,3] –

+1

@ NG。很難說,也許它確實是OP想要的。如果不是,'collections.Counter'也可以。 – delnan

+0

@NG。我沒有任何重複的東西,所以它會工作! Thx的答案我會盡快標記! – JmRag

2

如果列表都不允許有重複的元素:

def list_eql(x, y): 
    return sorted(x) == sorted(y) 

如果列表中沒有重複的元素:

def list_eql(x, y): 
    return set(x) == set(y) 

編輯:我明白你的問題xy是列出的名單。 在這種情況下set解決方案將無法正常工作(因爲列表是可變的),你將需要內部列表第一轉換爲元組:

def list_eql(x, y): 
    return set(map(tuple, x)) == set(map(tuple, y)) 
+2

如果列表有重複,只檢查兩個列表的長度將不起作用。 考慮列表x = [1,1,2,2,3],y = [1,1,1,2,3]。即使這兩個列表不相等,你的函數也會返回true。 –

+0

@ sk4x0r:很好,我已經編輯了我的答案,謝謝。 –