所以我有一個Python中的函數,它有一個包含列表的列表,我試圖比較列表的內容,看看它是否有重複,然後返回True,如果有重複。本質上是這樣的;比較複雜的列表
def dupCheck():
aList = ([3.3,3.2], [1,1], [3.3,3.2], [7,7])
if duplicates in aList:
return True
return False
所以我有一個Python中的函數,它有一個包含列表的列表,我試圖比較列表的內容,看看它是否有重複,然後返回True,如果有重複。本質上是這樣的;比較複雜的列表
def dupCheck():
aList = ([3.3,3.2], [1,1], [3.3,3.2], [7,7])
if duplicates in aList:
return True
return False
通常檢查列表中是否有重複的時候,你只需創建從列表中set
,從而刪除重複項,然後將該集合的大小與原始列表的大小。在這種情況下,這是不可能的,因爲嵌套列表不可哈希,因此不能添加到集合中。但是,如果你總是有一個列表列表(而不是列表列表和其他列表,或列表列表),那麼你可以將子列表轉換爲元組,然後將它們放入集合中。
>>> def dupCheck(lst):
... return len(set(tuple(l) for l in lst)) != len(lst) # duplicates -> true
...
>>> dupCheck([[3.3,3.2], [1,1], [3.3,3.2], [7,7]])
True
完全是pythonic的做法! –
問題:這是一個很好的解決方案,但它會觸摸列表中的ever元素。不會有更有效的解決方案來構建一套'看過的'。通過元素循環,如果看到元素,返回True,否則seen.add(元素)。循環後,返回False ... –
你可以做到這一點懶洋洋,在地方建立了一套完整的第一對第一重複返回true:
def dup_check(lst):
seen = set()
for tup in map(tuple, lst):
if tup in seen:
return True
seen.add(tup)
return False
爲了讓懶惰的評價,你應該在的地方使用itertools.imap地圖使用python2。
如果你想接近一個班輪解決方案,你可以採取的事實優勢set.add回報無與任何結合:
def dup_check(lst):
seen = set()
return any(tup in seen or seen.add(tup) for tup in map(tuple, lst))
seen.add(tup)
總是將是沒有只有當我們已經添加了一個相同的元組時纔會tup在看到返回True所以任何會在第一次重複時短路或者如果沒有重複返回False。
的解決方案列出了問題的列表:
def remove_doubles(a):
"""Removes list doubles in list where list(set(a)) will raise a TypeError."""
clean_list = []
for b in a:
if b not in clean_list:
clean_list += [b]
return clean_list
有像SO和代碼審查6個問題已有關於這個主題。你應該先詢問才能搜索。 – Rockybilly
好吧,這是一個不錯的(破碎)功能。我不確定你期望我們做什麼,因爲**你實際上沒有提出問題。** –