我试图弄清楚如何从2D列表中删除重复项。让我们举个例子:
<p align=\"center\"><img src=\"Icons/TroopCards/ArchersCard.png\"/></p>
<p style=\"text-align:center\">Some text at middle</p>
我想要结果:
x= [[1,2], [3,2]]
按此顺序。
其实我不明白为什么我的代码没有这样做:
[1, 2, 3]
如果我应该用嵌套的for循环形式写它,它看起来相同
def removeDuplicates(listNumbers):
finalList=[]
finalList=[number for numbers in listNumbers for number in numbers if number not in finalList]
return finalList
&#34;问题&#34;是这个代码完美运行。第二个问题是秩序很重要。感谢
答案 0 :(得分:2)
finalList
在列表理解上始终是空列表,即使您认为它在此期间附加到它,这与第二个代码(double { {1}}循环)。
我要做的是使用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]
<强> EDIT2:强>
如timgeb所述,显然>>> 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]
&amp; map
将丢弃最终无用且更糟糕的列表,它们消耗内存。所以,我会像你在上一个代码示例中那样使用filter
循环,但是如果你想要它使用列表理解方法而不是:
nested for
答案 1 :(得分:1)
首先将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)
。
答案 2 :(得分:1)
在将此列表理解的结果分配给finalList之前,首先评估右侧的表达式。 而在您的第二种方法中,您始终在迭代之间写入此列表。这就是区别。
这可能类似于手册在写入for循环内的迭代迭代时警告意外行为的注意事项。
您可以使用内置的set()
- 方法删除重复项(之前必须在列表中执行flatten()
)
答案 3 :(得分:0)
Python中没有办法引用当前的comprehesion。实际上,如果删除行无效的行finalList=[]
,则会出错。
您可以分两步完成:
finalList = [number for numbers in listNumbers for number in numbers]
finalList = list(set(finalList))
或者如果你想要一个单行:
finalList = list(set(number for numbers in listNumbers for number in numbers))