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



我曾尝试使用如下的列表理解来制作一个没有来自另一个定义列表的重复列表,

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]

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

使用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_list直到理解完成后才会更新。在理解过程中,my_list是一个空列表。

如果订单很重要,你想采取的方法是:

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

你应该试试这样的东西:

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]

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

您可以尝试此列表理解

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

如果你不在乎订单。

my_lst=list(set(num))

在Python3.6及以上版本中,字典存储插入顺序或使用collections.OrderedDict。所以,你可以试试这个。

num = [1, 2, 2, 2, 3, 3, 4, 4, 4, 5]
my_list=list(dict.fromkeys(num).keys())

可以使用seen集来跟踪所看到的图元。如果seen中的元素不添加到my_list中。

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]

最新更新