我有一个字符串列表。我正在尝试删除具有某些子字符串的元素。如果使用以下命令,则仅删除包含“Cantab”的元素:
for line in merged:
if 'Duke' in line and 'Sir' not in line or 'Cantab' in line or 'Rick' in line:
merged.remove(line)
如果我试图分解条件,我的目标结果就没有实现,但是我成功地删除了包含Duke的元素,但没有删除Duke爵士
if 'Duke' in line and 'Sir' not in line:
merged.remove(line)
这与预期一样有效:
if 'Duke' in line and 'Sir' not in line:
merged.remove(line)
elif 'Cantab' in line:
merged.remove(line)
但下面只删除包含“Cantab”的元素!!!地址:
if 'Duke' in line and 'Sir' not in line:
merged.remove(line)
elif 'Cantab' in line:
merged.remove(line)
elif 'Rick' in line:
merged.remove(line)
我搞不懂这里的逻辑。谢谢!你知道吗
一般来说,不要在列表上迭代和同时从列表中删除项。它移动尚未迭代的项的内部索引,以便不是所有项都被迭代。你知道吗
您可以通过在
merged
的副本上循环来解决此问题:此示例说明了问题:
印刷品
考虑循环的第一次迭代。当
line
等于Cantab
时,第一个Duke
的内部索引为1。但是在Cantab
被移除之后,第一个Duke
的内部索引变为0。但是Python将循环索引提前到1!现在第二个Cantab
在索引1处,因此第一个Duke
被完全跳过。你知道吗或者,您可以通过向后迭代列表来修复问题,而不必复制
merged
。这样做,删除merged
中的当前项是安全的,因为尚未迭代的项的位置不会被修改:印刷品
根据需要。你知道吗
相关问题 更多 >
编程相关推荐