【问题标题】:Delete an item from a list从列表中删除项目
【发布时间】:2011-03-18 23:12:41
【问题描述】:

嘿,我试图从列表中删除一个项目(不使用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))

【问题讨论】:

  • 我不确定你在问什么 - 什么设置功能? “应用这种方法”是什么意思?
  • 我认为他不想在他的列表中有重复项。
  • set 对象,就像在 s = set( [ 2, 2, 3, 4 ] ) 我猜 :) 是作业吗?
  • 我认为(希望)您这样做只是为了教育目的?
  • 也许你当时应该这么说,而不是让人们猜测。 (您可能还应该尝试接受其他问题的答案,阅读问题并投票)

标签: python list unique


【解决方案1】:

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

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 开始,而不是从零开始,因为 k=0 将访问 list1[-1]。

【讨论】:

  • -“范围函数在进入循环之前被评估一次”和“如果你发现重复,你不想继续下一次迭代,因为你会错过潜在的运行超过两个重复。”我正在寻找的答案,谢谢!
【解决方案2】:

【讨论】:

  • 独特且设置正常,我的问题是:我的代码有什么问题?
【解决方案3】:

而不是删除项目在新列表中写一个你想要的东西的列表理解:

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!

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

【讨论】:

    【解决方案4】:

    你可以使用del

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

    【讨论】:

    • 为什么是 -1 ?那我可能一开始还没有理解这个问题?
    • del 和 list1.remove 是一样的。问题不在这里!
    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 2016-05-08
    • 2020-12-07
    • 2010-11-29
    • 2016-08-17
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多