多条件if语句字符串关键字:in,not in

2024-10-03 11:15:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表。我正在尝试删除具有某些子字符串的元素。如果使用以下命令,则仅删除包含“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)

我搞不懂这里的逻辑。谢谢!你知道吗


Tags: orand字符串in元素iflinenot
1条回答
网友
1楼 · 发布于 2024-10-03 11:15:23

一般来说,不要在列表上迭代同时从列表中删除项。它移动尚未迭代的项的内部索引,以便不是所有项都被迭代。你知道吗

您可以通过在merged的副本上循环来解决此问题:

for line in list(merged):

此示例说明了问题:

merged = ['Cantab', 'Duke', 'Cantab', 'Duke', 'Cantab', 'Duke']
for line in merged:
    print(line)
    if 'Duke' in line and 'Sir' not in line or 'Cantab' in line or 'Rick' in line:
        merged.remove(line)           
print(merged)

印刷品

Cantab  # only the Cantab lines are being iterated over!
Cantab
Cantab
['Duke', 'Duke', 'Duke']

考虑循环的第一次迭代。当line等于Cantab时,第一个Duke的内部索引为1。但是在Cantab被移除之后,第一个Duke的内部索引变为0。但是Python将循环索引提前到1!现在第二个Cantab在索引1处,因此第一个Duke被完全跳过。你知道吗


或者,您可以通过向后迭代列表来修复问题,而不必复制merged。这样做,删除merged中的当前项是安全的,因为尚未迭代的项的位置不会被修改:

merged = ['Cantab', 'Duke']*3
for i in range(len(merged)-1, -1, -1):
    line = merged[i]
    if 'Duke' in line and 'Sir' not in line or 'Cantab' in line or 'Rick' in line:
        del merged[i] 
print(merged)

印刷品

[]

根据需要。你知道吗

相关问题 更多 >