我写了一个函数来从列表中删除奇数,就像这样:
def remove_odd(l):
for i in l:
if i % 2 != 0:
l.remove(i)
print l
return l
remove_odd([4,5,4])
remove_odd([4,5,4,7,9,11])
remove_odd([4,5,4,7,9,11,12,13])
Run Code Online (Sandbox Code Playgroud)
它返回:
[4, 4]
[4, 4, 9]
[4, 4, 9, 12]
Run Code Online (Sandbox Code Playgroud)
- >错了
但当我改为删除偶数时:
def remove_even(l):
for i in l:
if i % 2 == 0:
l.remove(i)
print l
return l
remove_even([4,5,4])
remove_even([4,5,4,7,9,11])
remove_even([4,5,4,7,9,11,12,13])
Run Code Online (Sandbox Code Playgroud)
答案还可以:
[5]
[5, 7, 9, 11]
[5, 7, 9, 11, 13]
Run Code Online (Sandbox Code Playgroud)
remove_odd()函数有什么问题?我知道人们通常会在func中创建第二个列表,然后将偶数附加到该列表中,但是我们可以用list.remove()解决这个练习吗?
谢谢!
Alt*_*ion 10
您的功能正在以您预期的方式工作.该for回路采用第一个元素,比第二等,所以当你删除一个元素,别人改变自己的位置,并且可以通过它可以跳过(和你的情况发生这种情况),当他们被另一个奇数开头.
如果您坚持使用.remove()方法,则必须使用副本进行操作,如下所示:
def remove_odd(1):
for i in l[:]:
if i % 2 != 0:
l.remove(i)
return l
Run Code Online (Sandbox Code Playgroud)
(l[:]是列表的浅表副本l)
但是,我认为使用列表理解会更加清晰:
def remove_odd(l):
return [x for x in l if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud)
remove_odd() 函数有什么问题?
您正在迭代列表,同时更改其大小。这导致它跳过一个或多个元素
为什么不使用列表理解。它更 Pythonic 和可读
def remove_odd(l):
return [e for e in l if e % 2 == 0]
remove_odd([4,5,4,7,9,11])
[4, 4]
Run Code Online (Sandbox Code Playgroud)
同样,您可以编写 remove_even 例程
def remove_even(l):
return [e for e in l if e % 2]
remove_even([4,5,4,7,9,11])
[5, 7, 9, 11]
Run Code Online (Sandbox Code Playgroud)
为此,Python 有一个内置方法: filter
filtered_list = filter(lambda x: x%2==0, input_list)
Run Code Online (Sandbox Code Playgroud)
在 Python 3 中要小心,因为这里的 filter 只是一个生成器,所以你必须写:
filtered_list = list(filter(lambda x: x%2==0, input_list))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24543 次 |
| 最近记录: |