我有一个列表
[['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']]
有人可以说明这有什么问题吗?
答案 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