从列表列表中删除特定类的所有元素

时间:2016-04-22 11:41:27

标签: python string list integer

我正在熟悉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循环来读取多列表中的每个列表并将上面的代码应用到每个列表中,但我不知道该怎么做。

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

4 个答案:

答案 0 :(得分:4)

假设您只有一个级别的子列表(并且您的最后一个元素是列表而不是字符串),您可以使用嵌套列表理解,如此

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 

答案 1 :(得分:1)

>>> [[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)]

答案 2 :(得分:1)

您的方法完全正常,但您需要使用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()。

答案 3 :(得分:0)

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

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