关于python:从列表中删除项目

Delete an item from a list

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

1
2
3
4
5
6
7
8
9
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函数工作正常,但我想应用这个方法。除非我得到:

1
 IndexError: list index out of range

在声明中:

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

编辑添加(感谢内德·巴切尔德)工作代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
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))


您的代码不起作用,因为在您的循环中,您正在迭代原始列表中的所有索引,但在执行过程中会缩短列表。在迭代结束时,您将访问不再存在的索引:

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

在进入循环之前,对range函数进行一次评估,创建列表中所有索引的列表。每次调用remove都会将列表缩短一倍,因此如果删除任何元素,就保证在列表末尾出现错误。

如果要使用这样的循环,请尝试:

1
2
3
4
5
6
k = 1
while k < len(list1):
    if list1[k] == list1[k-1]:
        del list1[k]
    else:
        k += 1

我还修了其他一些东西:

  • 在python if语句中,不需要在条件周围加括号。
  • 如果你发现了一个重复,你就不想进入下一个迭代,因为你会错过超过两个重复的潜在运行。
  • 您希望从索引1开始,而不是从零开始,因为k=0将访问列表1[-1]。

  • 看起来你好像在试图统一一个列表(说明会很棒),请看下面的内容:http://www.peterbe.com/plog/uniqifiers-benchmark

    这里还有一个关于so的问题:在python中,从列表中删除重复项的最快算法是什么,以便所有元素都是唯一的*同时保持顺序*?


    不要删除项目,而是编写一个列表,了解新列表中需要的内容:

    1
    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!

    所以:永远不要更改您迭代的列表


    您可以使用del

    1
    2
    3
    4
    l = [1, 2, 3, 4]
    del l[2]
    print l
    [1, 2, 4]