删除空的嵌套列表 - Python

Posted

技术标签:

【中文标题】删除空的嵌套列表 - Python【英文标题】:Remove empty nested lists - Python 【发布时间】:2016-02-01 19:18:54 【问题描述】:

我正在将 .csv 文件读取到一个列表中,它会附加一个空列表,我正在使用下面的代码来执行此操作。

with open('Scores.csv', 'r') as scores:
    reader = csv.reader(scores)
    tscores = [[str(e) for e in r] for r in reader]

它正确地创建一个嵌套列表的列表,但在读入的每一行之后附加一个空列表,如下所示:

[[score1, name1], [], [score2, name2], []]

我相信它将 \n 读取为空字符串,这就是我得到它的原因,所以我尝试使用以下方法删除空列表:

tscores = [tscores.remove(x) for x in tscores if x]

它确实删除了空的嵌套列表,但它将所有其他包含数据的嵌套列表设置为None,即[None, None]。我修改为:

tscores = [tscores.remove(x) for x in tscores if []]

彻底清除所有嵌套列表。

如何在不附加空列表的情况下读取具有相同输出(嵌套列表列表)的文件,或者如何在读入后删除所有空列表?

【问题讨论】:

【参考方案1】:

我想你想做的是

tscores = [x for x in tscores if x != []]

仅列出 tscores 中的非空列表

【讨论】:

【参考方案2】:

替代user2990008's answer,你不能首先创建空列表:

tscores = [[str(e) for e in r] for r in reader if len(r) > 0]

【讨论】:

这似乎也是一个很好的答案,而且可能是最合适的。编辑:这肯定也有效。【参考方案3】:

我不确定我是否正确理解了您的问题,但您可以使用以下方式从列表列表(或元组列表或其他序列列表)中删除空条目:

#/bin/python
# ...
with open('Scores.csv', 'r') as scores:
    reader = csv.reader(scores)
    tscores = [[str(e) for e in r] for r in reader if len(r)]

...请记住,您的列表推导可以处理可选的过滤条件子句。这只有在您可以确保您正在遍历的列表的每个元素都支持 len() 函数时才有效(当然,您可以通过使用更复杂的条件来确保这一点,例如:hasattr(r, 'len') 和 len(r)

注意:这只测试了一层深度......它不是递归的。

【讨论】:

【参考方案4】:

仅出于完整性考虑:在这种情况下,我认为列表推导式并不是最简单的解决方案。这里函数式编程是有意义的,恕我直言。

要“自动”遍历列表并过滤特定元素,您可以使用内置函数filter:

In [89]: a = [ [1, 2], [], [3, 4], [], [5, 6], [], [], [9, 5, 2, 5]]

In [91]: filter(lambda x: len(x) > 0, a)
Out[91]: [[1, 2], [3, 4], [5, 6], [9, 5, 2, 5]]

列表a 的每个元素x 都传递给lambda 函数,并且返回的列表仅包含a 的元素当且仅当满足条件len(x) > 0 时。因此返回一个没有嵌套空列表的列表。

【讨论】:

嗯...filter(lambda x: len(x) > 0, a) 在各方面都比[x for x in a if len(x) > 0] 更糟糕——同样的效果更慢且更不惯用。 在 Python 中它应该更慢,因为函数调用效率低下,是的 - 通常它取决于实现。然而,出于过滤目的,我(个人)喜欢这个,因为它更直观。这种情况就像filter() 的最默认情况之一。诚然,这是一个基于意见的决定,只是我的想法.. 是的,我倾向于做的是如果函数已经存在/在其他地方定义,我使用filter/map(例如map(str.strip, strs)而不是[x.strip() for x in strs]filter(is_gormed, maybe_gorms) [x for x in maybe_gorms if is_gormed(x)]),但如果我需要一个表达式,那么我使用列表推导。即使使用 map/filter,人们也可能不同意 - 列表推导确实更容易理解(可能是主观的)并且使用频率更高【参考方案5】:
tscores = [x for x in tscores if x]

如果列表为空,则条件将返回 false,因此不会包含在 tscores 中。

【讨论】:

以上是关于删除空的嵌套列表 - Python的主要内容,如果未能解决你的问题,请参考以下文章

从Python中的嵌套列表中删除连续的重复项?

Python坑:不要使用可变对象作为函数默认值生成器不保留迭代过后的结果嵌套列表创建==和is的区

从 Python 列表中删除重复项

python 如何对嵌套字典里的数据进行添加和删除?

如何在c ++中删除嵌套列表中的重复元素

p2·python中嵌套列表list元素输出·模块封装·发布上传(pigeon详细说)