你好,我想要一個名單與Python的另一個列表,其中的元素序列好好嘗試一下事項Python的元組進行比較
如
list=[1,2,3]
應等於list2=[3,2,1]
和等於list3=[3,1,2]
等。我想動態地這樣做,因爲我不知道列表中有多少元素?有沒有快速的方法來做到這一點?我想出的唯一方法是在每個列表中搜索另一個列表的元素,但這有O(n^2)。此外,我無法排序列表,因爲在我的實施中,列表是列表的列表。我只想回答簡單版本的問題,然後修改它!你可以幫我嗎?
你好,我想要一個名單與Python的另一個列表,其中的元素序列好好嘗試一下事項Python的元組進行比較
如
list=[1,2,3]
應等於list2=[3,2,1]
和等於list3=[3,1,2]
等。我想動態地這樣做,因爲我不知道列表中有多少元素?有沒有快速的方法來做到這一點?我想出的唯一方法是在每個列表中搜索另一個列表的元素,但這有O(n^2)。此外,我無法排序列表,因爲在我的實施中,列表是列表的列表。我只想回答簡單版本的問題,然後修改它!你可以幫我嗎?
您可以將列表簡單地轉換成集,然後簡單地檢查它們是否相等
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.counter
(Thanks @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
如果列表都不允許有重複的元素:
def list_eql(x, y):
return sorted(x) == sorted(y)
如果列表中沒有重複的元素:
def list_eql(x, y):
return set(x) == set(y)
編輯:我明白你的問題x
和y
是列出的名單。 在這種情況下set
解決方案將無法正常工作(因爲列表是可變的),你將需要內部列表第一轉換爲元組:
def list_eql(x, y):
return set(map(tuple, x)) == set(map(tuple, y))
如果列表有重複,只檢查兩個列表的長度將不起作用。 考慮列表x = [1,1,2,2,3],y = [1,1,1,2,3]。即使這兩個列表不相等,你的函數也會返回true。 –
@ sk4x0r:很好,我已經編輯了我的答案,謝謝。 –
不幸的是,最簡單的解決辦法可能_still_是與內部列表進行排序一個自定義的排序鍵。 –
你可能也想看看這個:http://stackoverflow.com/questions/21029678/undirected-tuple-comparison – fedorSmirnov