簡體   English   中英

使用列表解析從列表列表中刪除重復項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM