我曾尝试使用如下的列表理解来制作一个没有来自另一个定义列表的重复列表,
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]