假设我有以下列表:
m=[1,2,[1],1,2,[1]]
我希望带走所有重复的物品。如果不是列表中的括号,那么我可以使用:
m=list(set(m))
但是当我这样做时,我得到了错误:
不可散列的类型“ set”。
什么命令可以帮助我删除重复项,这样我只能留下列表
m=[1,2,[1]]
谢谢
答案 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]