【问题标题】:Pythonic way to delete all values past last index of "x" in Python listPythonic方法删除Python列表中“x”最后一个索引之后的所有值
【发布时间】:2017-05-22 07:17:28
【问题描述】:

搜索了一个类似的主题,因为我认为之前一定有人遇到过这个问题。任何相关主题的链接表示赞赏:)

我想删除“x”最后一个索引之后(包括)的所有值。

给定名单:a = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]

做某事,例如del a[a.rindex(2):]

最后是 a == [0, 1, 2, 3, 4, 5, 0, 1] - 注意 2 被删除了

【问题讨论】:

  • 您要删除列表表单中找到给定值的所有项目?
  • 我想在给定值最后一次出现后删除列表中的所有值

标签: python python-3.x


【解决方案1】:
def last_index(a,target):
    for i in a:
        check = a[-1]
        a.pop()
        if check == target :
            break
    return a

编辑 感谢 cmets,这可以像这样变得更简单:

def last_index(a,target):
    while a.pop() != target : pass
    return a

【讨论】:

  • 非常好。只是一个小建议:for _ in a: 会更 Pythonic:1. 循环中未使用的变量通常称为 _,2. 无需创建新的 range 对象(在 Python 3 中)或新列表(在 Python 中2) 这就是range(len(a)) 所做的。
  • 函数名last_index表明它只会返回索引,而实际上它也在修改原始列表。
  • 我最终使用了这个,但不是作为一个函数。是for _ in a: | a.pop() | if a[-1] == 0: | break,其中 |s 是换行符
  • @DeepSpace 谢谢,我也在努力让我的代码更加 Pythonic,你们的 cmets 真的帮了我大忙!当我需要当前项目的索引时,我通常使用 len(range(list)),但我猜在这种情况下这不是必需的。
  • @Mike @DeepSpace,你可以结合a.pop(); check = a[-1],不是吗? check = a.pop() ; while check != target: ; check = a.pop() 这也删除了目标。
【解决方案2】:
a = [1,2,4,2,3,4,5,2,3]

def delete_last_index(list,n):
  index = len(a) - 1 - a[::-1].index(n)
  return list[:index]

a = delete_last_index(a,2)
print(a)

这应该给出: [1, 2, 4, 2, 3, 4, 5]

【讨论】:

    【解决方案3】:

    Python 中没有rindex,index 返回first 出现的索引。

    使用len(a) - a[::-1].index(2)(倒数第一个就是最后一个)会返回最后一个2的索引,所以我们可以使用切片:

    li = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
    element = 2
    last_index = len(li) - li[::-1].index(element)
    li = li[:last_index - 1]
    print(li)
    # [0, 1, 2, 3, 4, 5, 0, 1]
    

    请注意,这种方法在性能部门并不是最好的,因为它需要在内存中创建一个列表,然后将其反转。

    【讨论】:

      【解决方案4】:

      我已经做到了你可能想要的东西:

      >>> a = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
      >>> last = len(a) - a[::-1].index(2) - 1
      >>> last
      8
      >>> a[:last]
      [0, 1, 2, 3, 4, 5, 0, 1]
      

      基于this question

      编辑

      或者,如果节省内存是一个问题,您可以遍历列表并逐个元素地弹出元素。这将更耗时,但内存消耗更少。

      >>> a = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
      >>> a
      [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
      >>> while a[-1] != 2:
      ...   a.pop()
      ... 
      5
      4
      3
      >>> a
      [0, 1, 2, 3, 4, 5, 0, 1, 2]
      >>> a.pop()
      2
      >>> a
      [0, 1, 2, 3, 4, 5, 0, 1]
      

      【讨论】:

        猜你喜欢
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        • 1970-01-01
        • 2015-08-21
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多