簡體   English   中英

如果我在帶括號的列表中有重復項,我該怎么辦

[英]If I have duplicates in a list with brackets, what should I do

假設我有以下列表:

 m=[1,2,[1],1,2,[1]]

我想帶走所有的重復。 如果不是列表中的括號,那么我可以使用:

 m=list(set(m))

但是當我這樣做時,我收到錯誤:

不可散列的類型“設置”。

什么命令可以幫助我刪除重復項,以便我只能留在列表中

 m=[1,2,[1]]

謝謝

您可以按照以下方式做一些事情:

m=[1,2,[1],1,2,[1]]
seen=set()
nm=[]
for e in m:
    try:
        x={e}
        x=e
    except TypeError:
        x=frozenset(e)  
    if x not in seen:
        seen.add(x) 
        nm.append(e)
>>> nm
[1, 2, [1]]

來自評論:此方法保留原始列表的順序。 如果您希望先按順序排列數字類型,然后再按其他類型,您可以執行以下操作:

sorted(nm, key=lambda e: 0 if isinstance(e, (int,float)) else 1)
result = []
for i in m:
  flag = True
  for j in m:
    if i == j:
      flag = False
  if flag:
    result.append(i)

結果將是: [1,2,[1]]

有很多方法可以縮短這段代碼,但為了可讀性,我寫得更冗長。 另外,請注意,此方法是 O(n^2),因此我不建議使用長列表。 但好處是簡單。

第一步是將內部列表轉換為元組:

>> new_list = [tuple(i) if type(i) == list else i for i in m]

然后創建一個集合來刪除重復項:

>> no_duplicates = set(new_list)
>> no_duplicates
{1, 2, (1,)}

如果您願意,您可以將其轉換為列表。

對於更通用的解決方案,您可以在將每個列表項傳遞給set()之前使用pickle.dumps序列化每個列表項,然后使用pickle.loads反序列化這些項:

import pickle
m = list(map(pickle.loads, set(map(pickle.dumps, m))))

如果您希望保持原始順序,則可以使用 dict (自 Python 3.6+ 起已成為有序)而不是集合:

import pickle
m = list(map(pickle.loads, {k: 1 for k in map(pickle.dumps, m)}))

或者,如果您需要與 Python 3.5 或更早版本兼容,則可以使用collections.OrderedDict代替:

import pickle
from collections import OrderedDict
m = list(map(pickle.loads, OrderedDict((k, 1) for k in map(pickle.dumps, m))))

簡單的解決方案,

m=[1,2,[1],1,2,[1]]
l= []
for i in m:
    if i not in l:
        l.append(i)
print(l)
[1, 2, [1]]

[Program finished] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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