【问题标题】:Removing all elements of a particular class from a list of lists从列表列表中删除特定类的所有元素
【发布时间】:2016-08-16 00:44:34
【问题描述】:

我正在熟悉 Python,目前正在研究“列表”的基本操作。

所以这是我的问题。

我有一个列表列表,除了两个整数之外,它主要包含“字符串”类元素: 假设我只想删除整数类元素,所以我只剩下一个未更改的列表列表,其中仅包含字符串元素:

即我的原始清单如下:

    listoflists=[['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10],
 ['eggs', 'ham', 'chicken', 'Pineapple'],
 'Onions']

我希望它变成以下内容:

listoflist=[['Juice', 'Pizza', 'Potatoes', 'Bananas'],
 ['eggs', 'ham', 'chicken', 'Pineapple'],
 'Onions']

到目前为止,我已经发现了如何使用以下方法从单数列表中删除整数类元素:

 no_integer_list = [x for x in listA if not isinstance(x, int)]

但我正在努力弄清楚如何将其应用于列表。

我正在考虑创建一个 for 循环来读取多列表中的每个列表并将上述代码应用于每个列表,但我不确定如何执行此操作。

对此的任何帮助将不胜感激。 非常感谢。

【问题讨论】:

  • 您的子列表有多深?只有 1 级?
  • 你的最后一个元素是故意的字符串吗?
  • 是的,我希望程序仅区分整数并假设其他所有内容都可以保留,无论类型如何。

标签: python string list integer


【解决方案1】:

一种灵活的递归解决方案,适用于任意数量的嵌套级别(甚至是不同的深度)以及列表和元组(但输出将是列表):

eliminate_int = lambda l: [eliminate_int(x) if isinstance(x, list) or isinstance(x, tuple) \
                           else x for x in l if not isinstance(x, int)]

listoflists=[ ['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10],
              ['eggs', 'ham', 'chicken', 'Pineapple'],
              'Onions' ]

print(eliminate_int(listoflists))

输出:

[['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions']

See this code running on ideone.com

【讨论】:

    【解决方案2】:

    假设您只有一层子列表(并且您的最后一个元素是列表而不是字符串),您可以像这样使用嵌套列表推导

    filtered = [[x for x in sublist if not isinstance(x, int)] for sublist in listoflists]
    

    输出

    [['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], ['Onions']]
    

    如果你的最后一个元素故意是一个字符串(或者可能是一个int),我会废弃凌乱的一个衬里,只写一个像这样的简单函数

    def filter_list(listoflists):
        newlist = []
        for element in listoflists:
            if isinstance(element, list):
                newlist.append([x for x in element if not isinstance(x, int)])
            elif isinstance(element, int):
                continue
            else:
                newlist.append(element)
        return newlist
    

    请注意,这旨在简单地删除所有 int 类型 - 其他类型将保留。如果您只想保留字符串并丢弃所有其他类型,则可以使用停止使用否定并拥有

    def filter_list(listoflists):
        newlist = []
        for element in listoflists:
            if isinstance(element, list):
                newlist.append([x for x in element if isinstance(x, str)])
            elif isinstance(element, str):
                newlist.append(element)
        return newlist 
    

    【讨论】:

    • 最后一个元素不是一个列表,而是一个字符串。
    • 还是不行,看看我对AKS回答的评论。
    • 非常感谢@DonkeyKong,你的想法似乎和我一样。 :-)
    【解决方案3】:
    >>> [[i for i in item if not isinstance(i, int)] if isinstance(item, list) else item for item in listoflists]
    [['Juice', 'Pizza', 'Potatoes', 'Bananas'],
     ['eggs', 'ham', 'chicken', 'Pineapple'],
     'Onions']
    

    更新: 仅出于完整性考虑,如果您的外部列表也有整数并且您也想删除它们:

    [[i for i in item if not isinstance(i, int)] if isinstance(item, list) else item 
     for item in listoflists if not isinstance(item, int)]
    

    【讨论】:

    • 这对嵌套列表之外的单个项目是整数不起作用。
    • 但这不是我在问题中看到的用例?而代码正是用户想要的结果。
    • @Kasramvd 我编辑了答案只是为了抓住那个用例。
    • 就像你说的@AKS,它完成了我需要的工作。谢谢,非常感谢。就像 Kasramvd 所说的那样,查看一些可以删除嵌套列表之外的整数的代码也很有用。
    • @AKS,啊,非常感谢! :-)
    【解决方案4】:

    您的方法完全没问题,但您需要使用 map() 函数或列表推导对每个子列表执行此操作。

    >>> l = [['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions']
    >>> map(lambda x: filter(lambda y: not isinstance(y,int),x),l)
    [['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions']
    

    除了使用 filter() 和 map() 之外,您还可以使用等效的列表推导方法。

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 2015-03-26
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多