【问题标题】:How to remove values from a list of list in Python如何从 Python 中的列表中删除值
【发布时间】:2017-05-05 13:10:44
【问题描述】:

我有一个列表

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

有人可以建议这有什么问题吗?

【问题讨论】:

  • 嵌套列表从何而来?最好在没有'' 的情况下创建它们。
  • @mkrieger1 我有一个未正确分隔的原始文件。我转换为列表,因此转换为输出。想要删除那些不需要的值。
  • 我的意思是:如果您向我们展示如何创建列表,我们可能会告诉您如何避免''条目,您无需再次删除它们。
  • @mkrieger1 那会更好。我会制作一个示例文件并使用我执行的代码编辑帖子。

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


【解决方案1】:

这就是你想要的:

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 在内部使用它,而您正在覆盖它的预期用法

【讨论】:

  • 显式测试可能会更好,因为这会过滤掉所有 falsy
  • @MosesKoledoye 是的。谢谢!
【解决方案2】:

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

但是,您可以使用 列表推导 过滤掉空字符串:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2020-11-14
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2018-05-01
    • 2015-05-04
    相关资源
    最近更新 更多