我正在熟悉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循环来读取多列表中的每个列表并将上面的代码应用到每个列表中,但我不知道该怎么做。
对此的任何帮助将不胜感激。 非常感谢提前。
答案 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']