我在试图移除时遇到了一个有趣且令人费解的情况 列表中的所有空字符串。我第一次写了下面的代码。在
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
它产生以下输出:
^{2}$注意:代码没有像它应该的那样工作。有一些空字符串在
输出。
后来我发现了更好的方法,比如:
列表理解:[x for x in lst if x!='']
或者创建一个新列表并将非空字符串复制到该列表中
比上面的代码更高效,因为它不涉及
每次从列表中删除元素时的位置。在
不过,对于上面代码的输出,我有一些问题。在
第一个问题是,为什么循环不运行十次(迭代次数是开的)
最左边)因为列表的原始长度是10。
第二,如果你看最右边的一列,你会发现它没有打印出来
打印@@@
字符串。它完全跳过了!!我的理论是in
运算符
sugar(最有可能)作为索引,以便即使列表的长度发生变化
指数一直在增加一。这可以解释为什么在第三次迭代中
i
的值是空字符串,而不是{lst[2]
是{
在使用in运算符时有什么需要知道的吗?在
每当你在循环中删除你正在迭代的东西时,你会得到这样奇怪的结果。如果迭代一个切片
[:]
,字符串将不再消失创建要迭代的副本,以便可以在不影响迭代的情况下操作列表元素
thispost描述了当您在列表上迭代时修改它时会发生什么。在
在内部,迭代列表使用索引。此索引在每次循环中递增1,并用于检索所需的元素。如果你在迭代的时候删除了一个元素,一个新元素将被“移到”你正在看的槽中,然后循环的下一个迭代将查看下一个,所以首先移动的元素永远不会被查看。在
一些解决方案包括:
lst[:] = (item for item if item != "")
这是最快的,因为它避免了在删除时多次移动项目。在reversed()
以相反的顺序迭代列表,这样您就只会“移动”您已经看到的项目。在在您的例子中,实际上不需要迭代列表。你只想删除其中的空字符串。所以第四个选择就是删除空字符串,直到没有空字符串为止!在
相关问题 更多 >
编程相关推荐