Python - 列表理解,2D列表

时间:2016-03-12 19:07:05

标签: python list-comprehension

我试图弄清楚如何从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;是这个代码完美运行。第二个问题是秩序很重要。感谢

4 个答案:

答案 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))