在Python中迭代时从列表中移除特定索引

2024-06-26 03:35:01 发布

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

我学习了如何在从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

Tags: ofin列表forifherevalueline
2条回答

您可以使用列表理解生成相同的内容:

somelist = [i for idx, i in enumerate(lists) if i[0] != lists[idx][0]]

基本上你的尝试是不支持根据任何文件。一般来说,您不应该在迭代时修改容器,除非文档明确指出您可以。如果它“似乎起作用”是没有帮助的,因为你只是利用了你正在使用的实现版本中的一些行为,但是这种行为可以在没有事先通知的情况下改变(破坏你的程序)。你知道吗

您需要做的是将修改从迭代中分离出来。使用列表理解是实现这一点的一种方法,但基本上你也在做同样的事情。你知道吗

有几个变体,要么你复制一个数据,然后遍历它,修改原始的。或者在迭代原始文件之前制作一个副本,修改副本,然后更新原始文件。还有一个变体,您可以在迭代过程中构建副本,然后更新原始副本。你知道吗

此外,您的示例还有缺陷,因为您没有考虑到修改会影响修改后的list中的正确索引。例如,如果您有列表[1, 1, 2, 2, 3, 3],那么当您删除了重复的12并检测到重复的3时,您就有了列表[1, 2, 3, 3],但是当您找到重复的3时,您会在索引45处找到它们,但是删除之后,它们反而在索引23处。你知道吗

lists = list() # a list of lists

cur = 0 # index in the modified list
for idx, line in list(enumerate(lists)): # make a copy of the original
    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[cur-1] # IndexError: list index out of range
        else:
            cur += 1
    else:
        cur += 1

修改副本的解决方案基本上是相同的,但是在迭代期间构建副本的解决方案有点不同。你知道吗

lists = list() # a list of lists

tmp = []
for idx, line in enumerate(lists): # make a copy of the original
    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:
            tmp.append(line)
    else:
        tmp.append( line )

 lists[:] = tmp

最后一行是原点被更新的地方,否则循环的工作方式是将要保留的元素附加到tmp(而不是复制所有元素,然后删除那些不保留的元素)。你知道吗

相关问题 更多 >