【问题标题】:How to delete an element from a sub-array in Python如何从 Python 中的子数组中删除元素
【发布时间】:2015-02-03 17:38:20
【问题描述】:

假设我们有一个像a = [['a','b','c'], ['aber', 'jsfn', 'ff', 'fsf', '003'], [...] ...] 这样的数组,其中每个元素可以有不同的大小。我想要做的是删除每个子数组的最后一项,如果它符合我设置的条件。所以我有:

for x in range(len(a)):
    if the last item in x matches some condition that is set:
        then remove the last item from x

因为我正在处理一个数组,所以我尝试了a.remove(-1),但这是错误的。那么,有没有什么简单的方法呢?

举个例子,如果我有:

for x in range(len(a)):
        if the last element of each sub-array starts with an "S":
            then remove the last item from that sub-array

我该如何处理?非常感谢任何示例或指向某些教程的链接。

【问题讨论】:

标签: python arrays


【解决方案1】:

Python 列表支持按索引的 del:

>>> l = [1,2]
>>> del l[-1]
[1]

.remove(value) 删除第一个匹配的值。

.pop(value) 与 remove 相同,但它返回被删除的值,如果你不给它一个值,它将“弹出”列表中的最后一项。

【讨论】:

    【解决方案2】:

    您在这里拥有的是列表列表,而不是数组本身。在此基础上,您可以做到以下几点:

    a = [['a','b','c'], ['aber', 'jsfn', 'ff', 'fsf', '003'], ['d', 'Starts With S']]  
    
    for sublist in a:
        if sublist[-1].startswith("S"):
            sublist.pop()
    
    print a
    

    运行时产生的结果:

    [['a', 'b', 'c'], ['aber', 'jsfn', 'ff', 'fsf', '003'], ['d']]
    

    【讨论】:

    • 不是最后一个元素,你能选择中间的任何元素吗?所以不是 if sublist[-1].startswith("S"): ,而是 if sublist[i].startswith("S"): 可行吗?
    • @JoojoJobala - 当然,您可以使用任何特定索引而不是 -1 - 尽管如果您的子列表长度可变,那么您需要先检查长度。不要使用不带参数的pop()(删除最后一个元素),而是使用pop(i)
    【解决方案3】:

    这里可能已经回答了Remove object from a list of objects in python

    但重申一下,您可以像这样弹出您想要的特定索引

    for x in range(len(a)):
            if the last element of each element starts with an "S":
                array.pop(x)
    

    【讨论】:

      【解决方案4】:

      首先,如果您只关心数组中的最后一个元素,那么您不需要遍历整个元素。

      只需检查数组中的最后一项是否以“S”开头,如果匹配则使用del a[-1]

      here 提出了类似的问题

      【讨论】:

        【解决方案5】:

        您可以将要删除的元素传递给remove(),或者如果您只想删除最后一个元素,请使用pop(),请参见以下示例:

        >>> a = [['a','b','c'], ['aber', 'jsfn', 'ff', 'fsf', '003']]
        >>> a[0].remove(a[0][1])  # a[0][1] is 'b'
        >>> a[0]
        ['a', 'c']
        >>> a
        [['a', 'c'], ['aber', 'jsfn', 'ff', 'fsf', '003']]
        >>> a[1].pop()  # remove the last element of a[1]
        '003'
        >>> a
        [['a', 'c'], ['aber', 'jsfn', 'ff', 'fsf']]
        

        【讨论】:

          【解决方案6】:

          首先,永远不要这样写:for x in range(len(a))。它正在工作,但在 Python 社区中不受欢迎。

          Python 可以遍历数组本身,使用for element in lst。然而,后一种结构不允许删除元素,但是有很多方法可以在没有for 语句的情况下遍历列表,即:

          删除元素也有几种方法:

          • lst.remove(value) 删除所有等于value的元素
          • filter(pred, lst) 删除与谓词 pred 匹配的所有元素并返回“过滤”列表。 IE。 lst = filter(lambda el: el[-1].startswith("S"), lst) 删除所有子列表,如果它们的最后一个元素以“S”开头。
          • lst.pop([i])lst[i] - 删除并返回索引为 i 的元素。对于pop,索引是可选的 - 默认情况下它是最后一个元素
          • 切片数组,使其不包含所需的元素。 IE。 lst[:i] 返回列表中从 0 到 i 的元素。所以要删除最后一个元素,你可以写lst = lst[:-1]

          所以您的示例可能如下所示:

          if all(el[-1].startswith("S") for el in a):
                a.pop() 
          

          请注意,我没有在列表推导周围写大括号 - 这是它的特殊形式,称为 生成器推导

          但是,您可以将 for-else 构造用于相同目的:

          for el in a:
              if not el[-1].startswith("S"):
                  # Last element of sublist is not starts with "S", do nothing
                  break
          else:
              # We walked over entire list and never called break, so 
              # all elements matched. Delete the last element!
              a = a[:-1]
          

          任君挑选。

          【讨论】:

            猜你喜欢
            • 2017-09-13
            • 2013-07-21
            • 2019-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-02
            • 2021-02-20
            相关资源
            最近更新 更多