首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -列表理解,2D列表

Python -列表理解,2D列表
EN

Stack Overflow用户
提问于 2016-03-13 03:07:05
回答 4查看 1.3K关注 0票数 1

我在想如何从2D列表中删除重复项。让我们举个例子:

代码语言:javascript
复制
x= [[1,2], [3,2]]

我想要结果:

代码语言:javascript
复制
[1, 2, 3]

按这个顺序。

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

代码语言:javascript
复制
def removeDuplicates(listNumbers):
    finalList=[]
    finalList=[number for numbers in listNumbers for number in numbers if number not in finalList]
    return finalList

如果我应该以嵌套的for循环形式编写它,它看起来应该是一样的

代码语言:javascript
复制
def removeDuplicates(listNumbers):
    finalList=[]
    for numbers in listNumbers:
        for number in numbers:
            if number not in finalList:
                finalList.append(number)
    return finalList

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

EN

回答 4

Stack Overflow用户

发布于 2016-03-13 03:13:20

finalList始终是列表中的一个空列表-理解,即使您认为它是在添加到它的过程中,这与第二个代码(双for循环)的情况并不完全相同。

我要做的是使用set

代码语言:javascript
复制
>>> set(i for sub_l in x for i in sub_l)
{1, 2, 3}

编辑:换种方式,如果顺序很重要,请使用

代码语言:javascript
复制
>>> 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]

代码语言:javascript
复制
>>> 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循环,就像您在上一个代码示例中所做的那样,但是如果您希望使用列表理解方法,那么:

代码语言:javascript
复制
>>> 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)
票数 2
EN

Stack Overflow用户

发布于 2016-03-13 03:12:00

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

代码语言:javascript
复制
if number not in finalList

将一直处于False状态。

在作业发生之前,你的理解的右边部分将会被评估。

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

代码语言:javascript
复制
>>> 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?

编辑:

您不需要使用导入来展平列表,只需使用生成器即可

代码语言:javascript
复制
(item for sublist in x for item in sublist)

而不是chain.from_iterable(x)

票数 1
EN

Stack Overflow用户

发布于 2016-03-13 03:12:59

在将此列表理解的结果赋给finalList之前,首先对右侧的表达式求值。而在你的第二种方法中,你总是在迭代之间写入这个列表。这就是区别所在。

这可能类似于手册在for循环中写入迭代迭代器时警告意外行为的原因。

您可以使用内置的set()-method来删除重复项(之前您必须对列表执行flatten()操作)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35962052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档