【发布时间】:2019-02-01 12:42:46
【问题描述】:
假设我有以下列表:
m=[1,2,[1],1,2,[1]]
我希望删除所有重复项。如果不是列表中的括号,那么我可以使用:
m=list(set(m))
但是当我这样做时,我得到了错误:
不可散列的类型'set'。
什么命令可以帮助我删除重复项,这样我就只能留在列表中
m=[1,2,[1]]
谢谢
【问题讨论】:
标签: python-3.x list set brackets
假设我有以下列表:
m=[1,2,[1],1,2,[1]]
我希望删除所有重复项。如果不是列表中的括号,那么我可以使用:
m=list(set(m))
但是当我这样做时,我得到了错误:
不可散列的类型'set'。
什么命令可以帮助我删除重复项,这样我就只能留在列表中
m=[1,2,[1]]
谢谢
【问题讨论】:
标签: python-3.x list set brackets
简单的解决方案,
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]
【讨论】:
结果将是:[1,2,[1]]
有一些方法可以使这段代码更短,但为了便于阅读,我写得更冗长。另外,请注意,这种方法是 O(n^2),所以我不推荐长列表。但好处是简单。
【讨论】:
对于更通用的解决方案,您可以使用pickle.dumps 序列化每个列表项,然后将它们传递给set(),然后使用pickle.loads 反序列化这些项目:
import pickle
m = list(map(pickle.loads, set(map(pickle.dumps, m))))
如果您希望保持原始顺序,可以使用 dict(自 Python 3.6+ 起已成为有序)而不是 set:
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]]
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]]
来自 cmets:此方法保留原始列表的顺序。如果您希望数字类型在前,其他类型在后,您可以这样做:
sorted(nm, key=lambda e: 0 if isinstance(e, (int,float)) else 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,)}
如果您愿意,可以将其转换为列表。
【讨论】: