繁体   English   中英

删除空的嵌套列表-Python

[英]Remove empty nested lists - Python

我正在将.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 []]

这会彻底清除所有嵌套列表。

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

我想你想做的是

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

这使得tscores中只列出了空列表

替代user2990008的答案 ,您不能首先创建空列表:

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

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

要“自动”遍历列表并过滤特定元素,可以使用内置函数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]]

每个元素x列表的a被传递给lambda功能和返回的列表仅包含的元素a当且仅当条件len(x) > 0成立。 因此,将返回没有嵌套空列表的列表。

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

#/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)的

注意:这仅测试一个深度级别...它不是递归的。

tscores = [x for x in tscores if x]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM