如何从Python中的列表列表中删除值

时间:2017-05-05 13:10:44

标签: python list python-3.x nested-lists

我有一个列表

[['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']]

我想从列表中删除所有''。

我尝试的代码是:

>>> for line in list:
...     if line == '':
...         list.remove(line)
...
print(list)

它显示的输出是:

[['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']]

有人可以说明这有什么问题吗?

2 个答案:

答案 0 :(得分:4)

这就是你想要的:

a = [['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']]
b = [[x for x in y if x != ''] for y in a]  # kudos @Moses
print(b)  # prints: [['Name', 'Place', 'Batch'], ['11', 'BBI', '2015'], ['12', 'CCU', '2016'], ['13', 'BOM', '2017']]

您的解决方案不起作用,因为line成为每个步骤中的整个子列表,而不是子列表的元素。

现在看来您正在尝试就地修改原始列表(不创建任何其他变量)。这是一个崇高的原因,但是在循环时循环遍历您正在修改的列表是不可取的,并且可能会导致您的代码引发错误(IndexError或其他)。

最后,请不要使用名称list,因为Python在内部使用它,而您正在覆盖其预期的用法

答案 1 :(得分:2)

您在子列表上运行测试而不在其包含的项目上运行测试。而且你需要一个嵌套的for来做你想做的事。但是,在迭代时使用list.remove从列表中删除项目通常会导致不可预测的结果。

但是,您可以使用列表理解来过滤掉空字符串:

r = [[i for i in x if i != ''] for x in lst]
#                       ^^ filter condition