Python列表理解,2D-lis

2024-09-28 21:49:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在想办法从2D列表中删除重复项。例如:

x= [[1,2], [3,2]]

我想要结果:

^{pr2}$

按这个顺序。在

实际上,我不明白为什么我的代码没有做到这一点:

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

“问题”是这段代码运行得非常完美。第二个问题是顺序很重要。谢谢


Tags: innumber列表forreturnif顺序def
3条回答

首先将finalList声明为空列表,因此

if number not in finalList

将一直False。在

作业开始前,你的理解能力的右侧将被评估。在

迭代迭代器chain.from_iterable提供给您并以通常的方式删除重复项:

^{pr2}$

进一步阅读: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)。在

finalList在您的列表理解中始终是一个空的列表,即使您认为它是在此期间附加到它的,这与第二个代码(双for循环)的情况不同。在

我要做的是使用set

>>> set(i for sub_l in x for i in sub_l)
{1, 2, 3}

编辑: 另一方面,如果订单很重要,并接近您的尝试:

^{pr2}$

或者

>>> 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]

编辑2: 正如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)

在将列表理解的结果分配给finalList之前,首先对右侧的表达式进行求值。 而在第二种方法中,每次迭代之间都要写这个列表。这就是区别。在

这可能与手册在for循环中写入迭代iterable时警告意外行为的注意事项类似。在

您可以使用内置的set()-方法来删除重复项(之前必须在列表中执行flatten()

相关问题 更多 >