在尝试从列表中删除所有空字符串时,我遇到了一个有趣且令人费解的情况。我第一次写了下面的代码。
lst=['###','','@@@','','$$$','','','%%%','','&&&']
print "len:",len(lst)
iteration=1
for item in lst:
print iteration,":",lst,":",len(lst),":","'%s'"%item
if item!='':
pass
else:
lst.remove(item)
iteration+=1
它产生以下输出:
len: 10
1 : ['###', '', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 10 : '###'
2 : ['###', '', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 10 : ''
3 : ['###', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 9 : ''
4 : ['###', '@@@', '$$$', '', '', '%%%', '', '&&&'] : 8 : ''
5 : ['###', '@@@', '$$$', '', '%%%', '', '&&&'] : 7 : '%%%'
6 : ['###', '@@@', '$$$', '', '%%%', '', '&&&'] : 7 : ''
注意:代码不能正常工作。输出中有一些空字符串。后来我发现了更好的方法,例如:列表推导:[x for x in lst if x!='']
或创建一个新列表并将非空字符串复制到其中,这恰好比上面的代码更有效,因为它不涉及每次删除元素时移动位置名单。
但是,我对上述代码的输出有一些疑问。
第一个问题是,为什么循环不运行十次(迭代次数在最左边),因为列表的原始长度是十。其次,如果您查看最右边的列,您会意识到它不会打印 print@@@
字符串。它完全跳过它!我的理论是in
运算符是索引的糖(最有可能),因此即使列表的长度发生变化,索引也会不断增加一。这可以解释为什么在第三次迭代中的值i
是空字符串而不是@@@
因为lst[2]
是''
。
使用 in 运算符时有什么需要知道的吗?