2016-04-22 105 views
3

我正在熟悉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)] 

但我努力让我围绕如何将其应用到列表的表头。

我正在考虑做一个循环来读取多列表中的每个列表并将上面的代码应用到每个列表,但我不知道如何做到这一点。

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

+0

你的子列表有多深?只有1级? – luke14free

+0

是的,只有一个级别 – Nathan

+0

最后一个元素是故意为字符串吗? – miradulo

回答

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'] 

UPDATE:只是为了完整性如果外部列表也有整数和要删除那些过于:

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

这不适用于嵌套列表之外的单个项目是整数。 – Kasramvd

+0

但这不是我在问题中看到的用例吗?代码完全导致用户想要的内容。 – AKS

+0

@Kasramvd我编辑答案只是为了抓住用例。 – AKS

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'] 

而不是使用过滤器()和map(),你也可以使用等效的列表解析方法。

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 
+0

介意解释downvote? :/ – miradulo

+1

最后一个元素不是一个列表,而是一个字符串。 – AKS

+0

它仍然不起作用,请查看我对AKS答案的评论。 – Kasramvd

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

相关问题