当python遍历列表中的操作符时,它的行为如何

2024-04-19 19:23:42 发布

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

我在试图移除时遇到了一个有趣且令人费解的情况 列表中的所有空字符串。我第一次写了下面的代码。在

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运算符时有什么需要知道的吗?在


Tags: 字符串代码in列表forlenif情况
2条回答

每当你在循环中删除你正在迭代的东西时,你会得到这样奇怪的结果。如果迭代一个切片[:],字符串将不再消失

for item in lst[:]:

创建要迭代的副本,以便可以在不影响迭代的情况下操作列表元素

thispost描述了当您在列表上迭代时修改它时会发生什么。在

在内部,迭代列表使用索引。此索引在每次循环中递增1,并用于检索所需的元素。如果你在迭代的时候删除了一个元素,一个新元素将被“移到”你正在看的槽中,然后循环的下一个迭代将查看下一个,所以首先移动的元素永远不会被查看。在

一些解决方案包括:

  • 创建一个新列表(可能使用列表理解),而不是从旧列表中删除项。如果需要,可以使用切片分配将新列表分配回原始容器:lst[:] = (item for item if item != "")这是最快的,因为它避免了在删除时多次移动项目。在
  • 使用reversed()以相反的顺序迭代列表,这样您就只会“移动”您已经看到的项目。在
  • 迭代列表的副本,但修改原始列表。在

在您的例子中,实际上不需要迭代列表。你只想删除其中的空字符串。所以第四个选择就是删除空字符串,直到没有空字符串为止!在

try:
     while True:
         lst.remove('')   # deletes first empty string
except ValueError:        # no more empty strings
     pass

相关问题 更多 >