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)) |
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]) |
在进入循环之前,对
如果要使用这样的循环,请尝试:
1 2 3 4 5 6 | k = 1 while k < len(list1): if list1[k] == list1[k-1]: del list1[k] else: k += 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!
所以:永远不要更改您迭代的列表
您可以使用
1 2 3 4 | l = [1, 2, 3, 4] del l[2] print l [1, 2, 4] |