我在想如何从2D列表中删除重复项。让我们举个例子:
x= [[1,2], [3,2]]我想要结果:
[1, 2, 3]按这个顺序。
实际上,我不明白为什么我的代码不能做到这一点:
def removeDuplicates(listNumbers):
finalList=[]
finalList=[number for numbers in listNumbers for number in numbers if number not in finalList]
return finalList如果我应该以嵌套的for循环形式编写它,它看起来应该是一样的
def removeDuplicates(listNumbers):
finalList=[]
for numbers in listNumbers:
for number in numbers:
if number not in finalList:
finalList.append(number)
return finalList“问题”是这段代码运行得很好。第二个问题是顺序很重要。谢谢
发布于 2016-03-13 03:13:20
finalList始终是列表中的一个空列表-理解,即使您认为它是在添加到它的过程中,这与第二个代码(双for循环)的情况并不完全相同。
我要做的是使用set
>>> set(i for sub_l in x for i in sub_l)
{1, 2, 3}编辑:换种方式,如果顺序很重要,请使用:
>>> final_list = []
>>> x_flat = [i for sub_l in x for i in sub_l]
>>> list(filter(lambda x: f.append(x) if x not in final_list else None, x_flat))
[] #useless list thrown away and consumesn memory
>>> f
[1, 2, 3]或
>>> list(map(lambda x: final_list.append(x) if x not in final_list else None, x_flat))
[None, None, None, None] #useless list thrown away and consumesn memory
>>> f
[1, 2, 3]EDIT2:正如timgeb提到的,很明显map & filter会丢弃那些无用的列表,更糟糕的是,它们会消耗内存。因此,我将使用nested for循环,就像您在上一个代码示例中所做的那样,但是如果您希望使用列表理解方法,那么:
>>> x_flat = [i for sub_l in x for i in sub_l]
>>> final_list = []
>>> for number in x_flat:
if number not in final_list:
finalList.append(number)发布于 2016-03-13 03:12:00
首先将finalList声明为空列表,因此
if number not in finalList将一直处于False状态。
在作业发生之前,你的理解的右边部分将会被评估。
对chain.from_iterable提供的迭代器进行迭代,并以通常的方式删除重复项:
>>> from itertools import chain
>>> x=[[1,2],[3,2]]
>>>
>>> seen = set()
>>> result = []
>>> for item in chain.from_iterable(x):
... if item not in seen:
... result.append(item)
... seen.add(item)
...
>>> result
[1, 2, 3]进一步阅读:How do you remove duplicates from a list in Python whilst preserving order?
编辑:
您不需要使用导入来展平列表,只需使用生成器即可
(item for sublist in x for item in sublist)而不是chain.from_iterable(x)。
发布于 2016-03-13 03:12:59
在将此列表理解的结果赋给finalList之前,首先对右侧的表达式求值。而在你的第二种方法中,你总是在迭代之间写入这个列表。这就是区别所在。
这可能类似于手册在for循环中写入迭代迭代器时警告意外行为的原因。
您可以使用内置的set()-method来删除重复项(之前您必须对列表执行flatten()操作)
https://stackoverflow.com/questions/35962052
复制相似问题