从列表中删除项

0 投票
4 回答
563 浏览
提问于 2025-04-16 01:37

嘿,我想从一个列表中删除一个项目(不使用 set):

list1 = []
for i in range(2,101):
    for j in range(2,101):
        list1.append(i ** j)
list1.sort()
for k in range(1,len(list1) - 1):
    if (list1[k] == list1[k - 1]):
        list1.remove(list1[k])
print "length = " + str(len(list1))

使用 set 函数可以正常工作,但我想用这个方法。不过我遇到了:

 IndexError: list index out of range

在这条语句上:

 if (list1[k] == list1[k - 1]):

编辑补充(感谢 Ned Batchelder),可以正常工作的代码是:

list1 = []
for i in range(2,101):
 for j in range(2,101):
   list1.append(i ** j)
list1.sort()
k = 0
while k < len(list1) - 1: # while loop instead of for loop because "The range function is evaluated once before the loop is entered"
 k += 1
 if (list1[k] == list1[k - 1]):
  list1.remove(list1[k])
  list1.sort()
  k -= 1 # "If you find a duplicate, you don't want to move onto the next iteration, since you'll miss potential runs of more than two duplicates"
print "length = " + str(len(list1))

4 个回答

2

与其删除列表中的项目,不如用列表推导式来创建一个新列表,里面只包含你想要的东西:

list1[:] = [list1[k] for k in range(1,len(list1) - 1) 
                     if not list1[k] == list1[k - 1] ]

你的方法出错是因为你在遍历列表时删除了项目。这样一来,列表就变得短了,下一个循环就会跳过一个项目。比如说,你看的是k=0,列表L = [1,2,3]。你删除了第一个项目,结果L变成了[2,3],接下来k变成1。这样你就看到了L[1],也就是3——你跳过了2!

所以:在遍历的过程中,绝对不要改变你正在遍历的列表

3

看起来你是在尝试让一个列表中的元素变得唯一(如果能进一步解释一下就更好了)。你可以看看这个链接:http://www.peterbe.com/plog/uniqifiers-benchmark

这里还有一个相关的问题在StackOverflow上:在Python中,去除列表中的重复元素,保持元素顺序的同时,最快的算法是什么?

5

你的代码之所以不工作,是因为在循环中,你是遍历原始列表的所有索引,但在这个过程中又在缩短列表。这样一来,等你循环结束时,你会试图访问那些已经不存在的索引:

for k in range(1,len(list1) - 1):
    if (list1[k] == list1[k - 1]):
        list1.remove(list1[k])

range 函数在进入循环之前就被计算了一次,它会生成一个包含所有索引的列表。每次调用 remove 都会让列表少一个元素,所以如果你删除了任何元素,最后就一定会出现错误,因为你会访问到已经被删掉的部分。

如果你想像这样使用循环,可以试试:

k = 1
while k < len(list1):
    if list1[k] == list1[k-1]:
        del list1[k]
    else:
        k += 1

我还修正了一些其他问题:

  1. 在 Python 的 if 语句中,条件不需要加括号。
  2. 如果你发现有重复的元素,不要直接进入下一次循环,因为这样会错过可能有多个重复的情况。
  3. 你应该从索引 1 开始,而不是 0,因为 k=0 会访问到 list1[-1]。

撰写回答