Python 使用列表理解从另一个定义的数组生成一个没有重复项的数组

Python 使用列表理解从另一个定义的数组生成一个没有重复项的数组,python,python-3.x,list,list-comprehension,Python,Python 3.x,List,List Comprehension,我曾尝试使用列表理解,从另一个定义的列表中创建一个没有重复项的列表,如下所示: num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5] my_list = [] my_list = [x for x in num if x not in my_list] 调用my_list后,我返回相同的数组 [1, 2, 2, 2, 3, 3, 4, 4, 4, 5] 有人能解释一下为什么会发生这种情况吗?你应该试试这样的方法: In [99]: num = [1, 2, 2, 2, 3

我曾尝试使用列表理解,从另一个定义的列表中创建一个没有重复项的列表,如下所示:

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
my_list = []
my_list = [x for x in num if x not in my_list]
调用
my_list
后,我返回相同的数组

[1, 2, 2, 2, 3, 3, 4, 4, 4, 5]

有人能解释一下为什么会发生这种情况吗?

你应该试试这样的方法:

In [99]: num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
    ...: my_list = []

In [100]: [my_list.append(item) for item in num if item not in my_list]
Out[100]: [None, None, None, None, None]

In [101]: my_list
Out[101]: [1, 2, 3, 4, 5]

列表理解过程完成后会更新列表,因为重复项仍然存在

我的列表在理解完成后才会更新。在理解过程中,我的列表是一个空列表

如果顺序很重要,您希望采取的方法是:

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
my_list = []
check_set = set()
for x in num:
    if x not in check_set:
        my_list.append(x)
        check_set.add(x)
如果顺序无关紧要:

my_list = list(set(num))

使用set比if条件和for循环更可行:

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
my_list = list(set(num))
print(my_list)
输出:

[1, 2, 3, 4, 5]
你可以试试这个列表

如果你不在乎订单的话

my_lst=list(set(num))
从Python3.6和更高版本开始,字典存储插入顺序或使用
collections.orderedict
。所以,你可以试试这个

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
my_list=list(dict.fromkeys(num).keys())
您可以使用
seen
set跟踪看到的元素。如果看到
中的元素
,请不要将其添加到
我的列表

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
seen=set()
my_list=[]
for x in num:
    if x not in seen:
        seen.add(x)
        my_list.append(x)
my_list
# [1,2,3,4,5]

my_list=list(set(num))
?如果您不关心顺序。
如果x不在我的列表中
将始终为真。如果它是空的,您为什么会期望它不是空的呢?
[x代表num中的x,如果x不在我的\u列表中]
将创建一个新对象,您将该对象分配给
我的\u列表
。它在迭代时不会将元素添加到
my_list
。@Ch3steR感谢您的澄清,非常感谢。@yatu感谢您的澄清,非常感谢将其传递给set(),这是一个模糊的for循环。对于优化的对象创建,建议通过循环来理解,但你放弃了它。作为阅读评论的唯一答案海报的道具。但这是O(n^2)。对于较大的输入大小,使用“输入”检查集可以获得回报,即使它重复了我的列表的内容。@KennyOstrom我修改了答案以解释这种低效率。
num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
seen=set()
my_list=[]
for x in num:
    if x not in seen:
        seen.add(x)
        my_list.append(x)
my_list
# [1,2,3,4,5]