场景:给出一个列表li = [1,2,3,4,6,5,8,12], 如何剔除掉列表中的偶数?
第一种方法:找出要保留的元素,放到临时列表中,再将临时列表赋值给原来的列表。
优点:简单,不易错
缺点:多一个临时列表,代码量增多,占用内存空间
li = [1,2,3,4,6,5,8,12]
temp = [] # 临时列表
for i in li:
if i % 2 != 0:
temp.append(i)
li = temp
print(li)
结果为[1, 3, 5]
第二种方法:直接在列表中进行删除操作
for i in li[:]:
# 注意要用li[:],若用li,则删除不准确
if i % 2 == 0:
li.remove(i)
print(li)
注意:要用li[:],若用li或者range(len(li)),然后进行判断+删除,会删不准确。
原因如下:列表的元素是有序的,每个元素都有下标
1.用li[:],下标和元素搭配是固定不变的
2.单纯用li或者for i in range(len(li)),虽然也是每个元素搭配一个下标,但当删除符合的偶数时,列表长度会发生变化,下标也跟着变化,是一个动态的过程。
我们可以看下
li = [2,1,9,10,4,5,6,8]
for i,j in enumerate(li[:]):
print(f'({i},{j})')
if j % 2 == 0:
print('---删除开始---')
print(i, j)
li.remove(j)
print('---删除结束---')
print(li)
结果为:
(0,2)
---删除开始---
0 2
---删除结束---
(1,1)
(2,9)
(3,10)
---删除开始---
3 10
---删除结束---
(4,4)
---删除开始---
4 4
---删除结束---
(5,5)
(6,6)
---删除开始---
6 6
---删除结束---
(7,8)
---删除开始---
7 8
---删除结束---
[1, 9, 5]
li = [2,1,9,10,4,5,6,8]
for i,j in enumerate(li):
print(f'({i},{j})')
if j % 2 == 0:
print('---删除开始---')
print(i, j)
li.remove(j)
print('---删除结束---')
print(li)