【问题标题】:Remove all integer from list in python从python中的列表中删除所有整数
【发布时间】:2021-12-01 06:01:04
【问题描述】:

如何删除列表中除最后一个整数之外的所有整数?

来自

mylist = [('a',1,'b',2,'c',3), ('d',1,'e',2),('f',1,'g',2,'h',3,'i',4)]

收件人

[('a','b','c',3), ('d','e',2),('f','g','h','i',4)]

我尝试在下面做,但没有任何反应。

no_integers = [x for x in mylist if not isinstance(x, int)]

【问题讨论】:

  • 每个元组最后一个整数包含所有整数的逻辑是什么?
  • 每个元组的最后一个 int 将是该元组的 id
  • 每个元组总是有最后一个整数。没有结尾是字符串的情况。

标签: python python-3.x list


【解决方案1】:

一种使用filter 的方法:

[(*filter(lambda x: isinstance(x, str), i), j) for *i, j in mylist]

输出:

[('a', 'b', 'c', 3), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]

解释:

  1. for *i, j in mylist:将mylist的元素(即('a',1,'b',2,'c',3),...)打包到直到最后一个*i)和最后一个 (j)。

    所以它会产生(('a',1,'b',2,'c'), 3)等等。

  2. filter(lambda x: isinstance(x, str), i):来自i:('a',1,'b',2,'c'),仅过滤掉str 对象。

    所以('a',1,'b',2,'c') 变成了('a','b','c')

  3. (*filter, j):将2的结果解包成一个元组,其最后一个元素是j

    所以它变成了('a', 'b', 'c', 3)

【讨论】:

  • 这是难以置信的不可读,我非常怀疑一个有问题的初学者能否理解这段代码。
  • @JanWilamowski 嗯.. 我同意可读性问题。我添加了一些解释,以便阅读它的人知道它的作用。
【解决方案2】:

clear()、pop() 和 remove() 是 list 的方法。您还可以使用 del 语句从列表中删除元素。,在 Python 中,使用列表方法 clear()、pop() 和 remove() 从列表中删除项目(元素)。也可以使用del语句通过索引或切片指定位置或范围来删除项目。,也可以通过指定整个范围来删除所有项目。,见下例。

l=列表(范围(10)) 打印(l) #[0,1,2,3,4,5,6,7,8,9] l.clear() 打印(l) #[]

【讨论】:

  • 这如何回答 OP 的问题?
【解决方案3】:

仅使用列表推导

每个元组总是有最后一个整数。没有结尾是字符串的情况。

记住您的上述评论,

  1. 您的方法几乎是正确的,只是您的列表实际上是一个元组列表。这意味着您需要一个嵌套循环来遍历子列表中的项目。
  2. 知道最后一个元素是必须保留的整数(最后一个整数),您可以简单地对每个子列表的n-1 项进行上述迭代,然后不管条件如何都追加最后一项。

检查 cmets 以了解每个组件的说明。

[tuple([item for item in sublist if not isinstance(item, int)]+[sublist[-1]]) for sublist in l]

#|___________________________________________________________| |____________| 
#                            |                                       |
#  Same as your method, iterating on n-1 items for each tuple        |
#                                                               append last item
#|____________________________________________________________________________________________|
#                                           |
#   Iterate over the list and then iterate over each sublist (tuples) with condition
[('a', 'b', 'c', 3), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]

因此,只需使用您的方法在子列表中进行迭代,同时使用单独的 for 循环来迭代子列表。

【讨论】:

    【解决方案4】:

    您可以使用listcomp 并像这样解包。

    [
        (*[c for c in subl if not isinstance(c, int)], last)
        for *subl, last in mylist
    ]
    
    Out: [('a', 'b', 'c', 3), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]
    

    PS:在this answer之后更新。谢谢克里斯。

    【讨论】:

      【解决方案5】:

      假设

      如果我们可以假设我们想要保留的 int 将始终是每个元组中的最后一个元素,那么这很容易。我们将过滤除最后一个元素之外的所有内容,并使用结果重建一个元组。

      >>> [tuple(list(filter(lambda x: not isinstance(x, int), l[:-1])) + [l[-1]]) for l in mylist]
      [('a', 'b', 'c', 3), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]
      >>>
      

      减少假设

      但是,如果正如您的问题中最初指定的那样,我们只想摆脱所有整数... 除了最后一个,我们不知道事情会发生什么顺序或位置在?

      首先是一个可能提供方便的函数:

      >>> def partition(pred, lst):
      ...     t, f = [], []
      ...     for x in lst:
      ...         (t if pred(x) else f).append(x)
      ...     return (t, f)
      ...
      >>>
      

      我们可以轻松地将您的数据划分为整数而不是整数:

      >>> partition(lambda x: isinstance(x, int), mylist[0])
      ([1, 2, 3], ['a', 'b', 'c'])
      >>> [partition(lambda x: isinstance(x, int), lst) for lst in mylist]
      [([1, 2, 3], ['a', 'b', 'c']), ([1, 2], ['d', 'e']), ([1, 2, 3, 4], ['f', 'g', 'h', 'i'])]
      >>>
      

      那么我们只需要丢弃除最后一个整数之外的所有整数,但是我们怎么知道在哪里将它们重新组合在一起?好吧,如果我们先枚举它们...

      >>> [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]
      [([(1, 1), (3, 2), (5, 3)], [(0, 'a'), (2, 'b'), (4, 'c')]), ([(1, 1), (3, 2)], [(0, 'd'), (2, 'e')]), ([(1, 1), (3, 2), (5, 3), (7, 4)], [(0, 'f'), (2, 'g'), (4, 'h'), (6, 'i')])]
      >>>
      

      现在我们只丢弃除最后一个 int 之外的所有内容,并将其添加回非 int 列表中以创建单个列表。

      >>> [(i[-1], ni) for i, ni in [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]]
      [((5, 3), [(0, 'a'), (2, 'b'), (4, 'c')]), ((3, 2), [(0, 'd'), (2, 'e')]), ((7, 4), [(0, 'f'), (2, 'g'), (4, 'h'), (6, 'i')])]
      >>> [ni + [i[-1]] for i, ni in [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]]
      [[(0, 'a'), (2, 'b'), (4, 'c'), (5, 3)], [(0, 'd'), (2, 'e'), (3, 2)], [(0, 'f'), (2, 'g'), (4, 'h'), (6, 'i'), (7, 4)]]
      >>>
      

      如果我们按照我们添加的索引进行排序 enumerate:

      >>> [sorted(ni + [i[-1]], key=lambda x: x[0]) for i, ni in [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]]
      [[(0, 'a'), (2, 'b'), (4, 'c'), (5, 3)], [(0, 'd'), (2, 'e'), (3, 2)], [(0, 'f'), (2, 'g'), (4, 'h'), (6, 'i'), (7, 4)]]
      >>>
      

      现在我们需要丢弃索引并转换回元组。

      >>> [tuple(map(lambda x: x[1], sorted(ni + [i[-1]], key=lambda x: x[0]))) for i, ni in [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]]
      [('a', 'b', 'c', 3), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]
      >>>
      

      现在,即使我们更改输入数据,我们也只保留最后一个 int,以及它原来的位置:

      >>> mylist = [('a',1,'b',2,'c',3,'d',6,'e','f'), ('d',1,'e',2),('f',1,'g',2,'h',3,'i',4)]
      >>> [tuple(map(lambda x: x[1], sorted(ni + [i[-1]], key=lambda x: x[0]))) for i, ni in [partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist]]
      [('a', 'b', 'c', 'd', 6, 'e', 'f'), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]
      >>>
      

      上面表达式中的内部列表推导可以用生成器表达式替换,解决方案仍然有效。

      >>> mylist = [('a',1,'b',2,'c',3,'d',6,'e','f'), ('d',1,'e',2),('f',1,'g',2,'h',3,'i',4)]
      >>> [tuple(map(lambda x: x[1], sorted(ni + [i[-1]], key=lambda x: x[0]))) for i, ni in (partition(lambda x: isinstance(x[1], int), enumerate(lst)) for lst in mylist)]
      [('a', 'b', 'c', 'd', 6, 'e', 'f'), ('d', 'e', 2), ('f', 'g', 'h', 'i', 4)]
      >>>
      

      【讨论】:

        【解决方案6】:

        使用循环和列表理解

        您可以遍历列表的每个元组,然后使用列表推导删除所有整数并添加最后一个元素。

        mylist = [('a',1,'b',2,'c',3), ('d',1,'e',2),('f',1,'g',2,'h',3,'i',4)]
        
        newlist = []
        #print(mylist)
        
        for ele in mylist:
            #print(ele)
            list_1 = tuple(([ x for x in list(ele) if not str(x).isdigit() ] + [ele[-1]]))
            newlist.append(list_1)
        
        print("Final List :")
        print(newlist)
        
        

        在列表理解之后添加最后一个带有索引的元素并将该列表转换为元组并将其附加到您的新列表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-10
          • 2017-05-07
          • 2016-08-26
          • 1970-01-01
          • 1970-01-01
          • 2014-04-01
          • 2015-04-03
          相关资源
          最近更新 更多