嘿,我试图从列表中删除一个项目(不使用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))
答案 0 :(得分: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 :(得分:3)
看起来你正试图统一列表(澄清会很棒)所以看看这里:http://www.peterbe.com/plog/uniqifiers-benchmark
答案 2 :(得分: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 :(得分:1)
您可以使用del
:
l = [1, 2, 3, 4]
del l[2]
print l
[1, 2, 4]