如果我在带有方括号的列表中有重复项,该怎么办

时间:2018-08-27 01:15:25

标签: python-3.x list set brackets

假设我有以下列表:

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

我希望带走所有重复的物品。如果不是列表中的括号,那么我可以使用:

 m=list(set(m))

但是当我这样做时,我得到了错误:

不可散列的类型“ set”。

什么命令可以帮助我删除重复项,这样我只能留下列表

 m=[1,2,[1]]

谢谢

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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),因此不建议使用长列表。但是好处就是简单。

答案 2 :(得分:1)

第一步是将内部列表转换为元组:

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

然后创建一个集合以删除重复项:

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

,您可以根据需要将其转换为列表。

答案 3 :(得分:1)

对于更通用的解决方案,您可以在将每个列表项传递给pickle.dumps之前,先将它们与set()序列化,然后再使用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))))

答案 4 :(得分:0)

简单的解决方案,

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]