为什么列表理解与没有理解的代码不一样?
Why list comprehension doesn't work the same as code without comprehension?
我尝试创建一个简单的函数来从列表中删除重复项。
x = [7, 7, 5, 6, 8, 9, 9, 0]
for n, i in enumerate(x):
if i in x[n + 1:]:
x.remove(i)
print(x)
输出:
[7, 5, 6, 8, 9, 0]
据我所知,这段代码工作正常。
但是当我试图将它转换为理解列表形式时,我得到了错误的输出:
def unique_list(lst):
return [lst.remove(i) for n, i in enumerate(lst) if i in lst[n + 1:]]
x = [7, 7, 5, 6, 8, 9, 9, 0]
print(unique_list(x))
输出:
[None, None]
所以,问题是 - 为什么输出不同?
a = [1, 2, 3]
deleted = a.remove(1)
print(deleted)
# returns None
print(a)
# returns [2, 3]
.remove() 更改列表并 returns None
您编写 set(x)
功能的两种方式并不相同。第一个是使用 x.remove(..)
的副作用 "return" 修改后的列表,第二个是 returns 新创建的列表。
该列表的元素由 返回 的表达式 lst.remove(i)
构成,正如 Manuel 在他们的文章中已经指出的那样 None
回答。
您收到 [None, None]
因为您的代码调用了 lst.remove
2 次。所以你的函数 unique_list
可以被称为 count_duplicates
,只是具有特殊的输出格式(使用 None
列表的长度编码结果而不是直接的 int
)。
我尝试创建一个简单的函数来从列表中删除重复项。
x = [7, 7, 5, 6, 8, 9, 9, 0]
for n, i in enumerate(x):
if i in x[n + 1:]:
x.remove(i)
print(x)
输出:
[7, 5, 6, 8, 9, 0]
据我所知,这段代码工作正常。
但是当我试图将它转换为理解列表形式时,我得到了错误的输出:
def unique_list(lst):
return [lst.remove(i) for n, i in enumerate(lst) if i in lst[n + 1:]]
x = [7, 7, 5, 6, 8, 9, 9, 0]
print(unique_list(x))
输出:
[None, None]
所以,问题是 - 为什么输出不同?
a = [1, 2, 3]
deleted = a.remove(1)
print(deleted)
# returns None
print(a)
# returns [2, 3]
.remove() 更改列表并 returns None
您编写 set(x)
功能的两种方式并不相同。第一个是使用 x.remove(..)
的副作用 "return" 修改后的列表,第二个是 returns 新创建的列表。
该列表的元素由 返回 的表达式 lst.remove(i)
构成,正如 Manuel 在他们的文章中已经指出的那样 None
回答。
您收到 [None, None]
因为您的代码调用了 lst.remove
2 次。所以你的函数 unique_list
可以被称为 count_duplicates
,只是具有特殊的输出格式(使用 None
列表的长度编码结果而不是直接的 int
)。