从列表中删除项
嘿,我想从一个列表中删除一个项目(不使用 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
我还修正了一些其他问题:
- 在 Python 的 if 语句中,条件不需要加括号。
- 如果你发现有重复的元素,不要直接进入下一次循环,因为这样会错过可能有多个重复的情况。
- 你应该从索引 1 开始,而不是 0,因为 k=0 会访问到 list1[-1]。