python 列表for循环remove删除出现漏删

文章目录


list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况。

问题

给定了一个日期列表(我这边用于判定文件夹是否存在)。

dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']

如果日期对应文件不存在,我就需要删除列表中对应的日期。

下面给出一段妄图删除所有元素的代码

for date in dateList:
        dateList.remove(date)
        print(date,dateList)

输出结果如下:

2022-05-03 [‘2022-05-04’, ‘2022-05-06’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
2022-05-06 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
2022-05-10 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-12’]

原因

结果分析:

  1. for循环从索引下标为0开始遍历, 2022-05-03 在第一次循环中被移除。dataList更新为不包含它的新列表[‘2022-05-04’, ‘2022-05-06’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
  2. 第二次循环中,索引下标从1开始遍历,2022-05-06被移除。dataList更新为 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
  3. 第三次循环中,索引下标从2开始遍历,2022-05-10被移除。dataList更新为 ['2022-05-04', '2022-05-08', '2022-05-12']
  4. 第四次循环中,索引下标从3开始遍历,发生索引越界,退出循环

解决

解决方法一(索引倒序遍历):
如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。

dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']
for i in range(len(dateList)-1,-1,-1):
        dateList.remove(dateList[i])
print(dateList)

输出结果:空列表

[]

解决方法二(新建一个列表保存结果):
如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。

dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']
dateItems = []
for i in range(len(dateList)-1,-1,-1):
    if os.path.isfile(path):
        dateItems.append(dateList[i])
print(dateItems)

print(dateItems[::-1])  #再用切片倒叙,回到顺序输出
#切片参数为 start:开始位(默认值为0) stop:结束位(默认值为列表长度) step:步长
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:Python 的 Felury 算法非常简单,只需要在给定的元组序列中搜索最小值即可。首先,初始化一个字典,其中键为元组,值为无穷大。然后,从给定的元组序列中搜索最小值,并将其存入字典中。最后,返回字典中最小值对应的元组。 ### 回答2: Felury算法(Fleury's Algorithm)是一种用于找出欧拉回路(Eulerian circuit)的算法。欧拉回路是指一条可以遍历图中每条边一次且只一次的闭合路径。 实现Felury算法的Python代码如下: ```python def fleury_algorithm(graph, start): # 深拷贝图,避免修改原图 g = graph.copy() circuit = [start] # 存储欧拉回路的路径 while len(g) > 0: current = circuit[-1] # 当前访问的节点 neighbors = g[current] # 当前节点的邻居 if len(neighbors) == 0: # 当前节点没有邻居,将其从路径中移除 circuit.pop() else: # 遍历当前节点的所有邻居 for neighbor in neighbors: # 判断移除当前邻居后是否为连通图 if not is_bridge(g, current, neighbor): break # 移除当前边 g[current].remove(neighbor) g[neighbor].remove(current) # 将当前邻居加入路径 circuit.append(neighbor) return circuit def is_bridge(graph, u, v): # 判断移除边(u, v)后,图是否为连通图 visited = set() stack = [u] while stack: node = stack.pop() if node not in visited: visited.add(node) stack.extend(graph[node]) return v not in visited # 示例使用 graph = { 'A': ['B', 'C', 'D'], 'B': ['A', 'C'], 'C': ['A', 'B', 'D'], 'D': ['A', 'C'] } start_node = 'A' euler_circuit = fleury_algorithm(graph, start_node) print(euler_circuit) ``` 以上代码实现了Felury算法。它使用了邻接表表示图,通过深度优先搜索来判断移除某条边后图的连通性。若连通,则移除该边,并将相邻节点添加到路径中,直到所有边都被访问过。最终返回的路径即为欧拉回路。 ### 回答3: Felury算法是一种用于寻找整数的质因数的算法,它是一种较为简单但高效的算法。下面是使用Python语言实现Felury算法的示例代码: ```python def felury(n): factors = [] i = 2 while i * i <= n: if n % i: i += 1 else: n //= i factors.append(i) if n > 1: factors.append(n) return factors # 测试代码 num = int(input("请输入一个正整数:")) factors = felury(num) print(f"{num}的质因数为:{factors}") ``` 代码中的`felury`函数接受一个正整数作为参数,然后使用循环从最小的质数2开始,逐步地找出它的质因数,并将这些质因数添加到一个列表中。在每一次循环中,如果给定的整数能够整除当前的质数,就将该质数作为一个质因数,并将整数除以该质数。直到整数变为1或者大于根号n时停止循环。最后,如果整数大于1,说明它本身就是一个质因数。运行结果会打印出给定整数的质因数列表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值