我学习了如何在从here迭代时从列表中删除项,方法是:
somelist = [x for x in somelist if determine(x)]
此外,如何在迭代时从列表中删除特定索引?例如
lists = list() # a list of lists
for idx, line in enumerate(lists):
if idx > 0:
cur_val = line[0] # value of current line
prev_val = lists[idx-1][0] # value of previous line
if prev_val == cur_val :
del lists[idex-1] # IndexError: list index out of range
您可以使用列表理解生成相同的内容:
基本上你的尝试是不支持根据任何文件。一般来说,您不应该在迭代时修改容器,除非文档明确指出您可以。如果它“似乎起作用”是没有帮助的,因为你只是利用了你正在使用的实现版本中的一些行为,但是这种行为可以在没有事先通知的情况下改变(破坏你的程序)。你知道吗
您需要做的是将修改从迭代中分离出来。使用列表理解是实现这一点的一种方法,但基本上你也在做同样的事情。你知道吗
有几个变体,要么你复制一个数据,然后遍历它,修改原始的。或者在迭代原始文件之前制作一个副本,修改副本,然后更新原始文件。还有一个变体,您可以在迭代过程中构建副本,然后更新原始副本。你知道吗
此外,您的示例还有缺陷,因为您没有考虑到修改会影响修改后的
list
中的正确索引。例如,如果您有列表[1, 1, 2, 2, 3, 3]
,那么当您删除了重复的1
和2
并检测到重复的3
时,您就有了列表[1, 2, 3, 3]
,但是当您找到重复的3
时,您会在索引4
和5
处找到它们,但是删除之后,它们反而在索引2
和3
处。你知道吗修改副本的解决方案基本上是相同的,但是在迭代期间构建副本的解决方案有点不同。你知道吗
最后一行是原点被更新的地方,否则循环的工作方式是将要保留的元素附加到
tmp
(而不是复制所有元素,然后删除那些不保留的元素)。你知道吗相关问题 更多 >
编程相关推荐