[英]Removing duplicates from list of lists by using list comprehension
我很好奇你是否可以從列表列表中刪除重復項並將uniques作為列表返回。 我在嘗試這個:
def do_list( lists ):
res = [ [ one for one in temp if one not in res ] for temp in lists ]
return res
例如,如果:
lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ]
結果應該是:
[ "a","b,"c","d","f" ]
但它給了我錯誤,我在分配之前參考變量res。
你可以這樣做:
set(itertools.chain.from_iterable(lists))
set
將刪除所有重復項, set
內部只是將列表展平為單個列表。
您收到錯誤是因為您在理解中引用了res
。 這不起作用,因為res
僅在表達式完成后可用。
由於我是一個奇怪的排序,並且因為標題要求“通過使用列表理解從列表列表中刪除重復”,我想看看你是否可以僅使用列表理解來做到這一點,而不是通過使用itertools
作弊 : p
這是如何:
>>> lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ]
>>> lists2 = sorted(sum(lists, []))
>>> [ item for i, item in enumerate(lists2) if i == 0 or i == len(lists2) or lists2[i - 1] != item ]
['a', 'b', 'c', 'd', 'f']
為了更加精神錯亂,您可以將它們組合在一條線上,但您必須重復sum()
和sorted()
調用。 我無法動搖自己寫出如此難看的代碼;-)
sum(lists, [])
將使列表變平; 它返回lists
中所有項目的總和( +
運算符),其中[]
作為初始列表。 sorted()
將對其進行排序。 這是必需的,因為我們只檢查最后一項 if
語句檢查前一項是否與當前項相同。 但它是丑陋的和非Pythonic。 對於Guido的愛,請使用Pythonista的答案 (或其中的一些變體)!
在評估整個列表res
之前,不會創建res
。 您可以使用一set
來刪除重復項:
res = list(set(sum(lists, [])))
如果你想要它排序:
res = sorted(set(sum(lists, [])))
如果你想要它的確切排序方式,列表理解可能不是最好的方法。 相反,這樣做:
res = []
for temp in lists:
res.append([])
for one in temp:
if one not in res[-1]:
res[-1].append(one)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.