如果我在带括号的列表中有重复项,我该怎么办
If I have duplicates in a list with brackets, what should I do
假设我有以下列表:
m=[1,2,[1],1,2,[1]]
我想删除所有重复项。如果不是列表中的括号,那么我可以使用:
m=list(set(m))
但是当我这样做时,出现错误:
不可散列类型 'set'。
什么命令可以帮助我删除重复项,以便我只能留在列表中
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
:[=17= 反序列化项目]
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)}))
或者如果需要兼容Python3.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]
假设我有以下列表:
m=[1,2,[1],1,2,[1]]
我想删除所有重复项。如果不是列表中的括号,那么我可以使用:
m=list(set(m))
但是当我这样做时,出现错误:
不可散列类型 'set'。
什么命令可以帮助我删除重复项,以便我只能留在列表中
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
:[=17= 反序列化项目]
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)}))
或者如果需要兼容Python3.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]