首页 > 解决方案 > 列表理解并不能消除重复

问题描述

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

new_list = []
new_list.append([num for num in a+b if num not in new_list])

print(new_list)

输出:

[[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]]

为什么这段代码会产生重​​复,而不仅仅是一个没有重复的所有数字的列表set()

标签: python

解决方案


new_list = []
new_list.append([num for num in a+b if num not in new_list])

有几件事阻止了它的工作。

  1. 要将一个列表的元素添加到另一个列表中,请使用extendnot append将整个列表append附加到输入列表,而不是添加单个元素。

  2. 即使您将其更改为extend,列表推导中的所有项目都会在添加到 之前生成new_list。它们不会一一添加,因此not in new_list检查不会看到以前迭代的项目。它将检查一个空的new_list.

这个成语实际上只能作为一个显式循环。我想你是从这样的事情开始的:

new_list = []
for num in a+b:
    if num not in new_list:
        new_list.append(num)

这种类型的循环不能很好地转换为列表推导,因为它具有自依赖性。循环取决于先前迭代的结果。


推荐阅读