[英]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.