删除空嵌套列表Python

2024-10-05 14:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读一个.csv文件到一个列表,它附加一个空列表,我用下面的代码来做这个。在

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

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

^{pr2}$

我相信它将\n作为一个空字符串读取,这就是为什么我会得到它,所以我尝试使用以下方法删除空列表:

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

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

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

它会完全清除所有嵌套的列表。在

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


Tags: 文件csv代码innone列表forif
3条回答

为了完整起见:在这种情况下,我认为列表理解不是最简单的解决方案。在这里函数式编程是有意义的,imho。在

要“自动”迭代列表并筛选特定元素,可以使用内置函数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函数,当且仅当满足条件len(x) > 0时,返回的列表只包含一个a元素。因此,返回一个没有嵌套空列表的列表。在

我想你想做的是

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

它只列出了tscores中的非空列表

除了user2990008's answer之外,您首先不能创建空列表:

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

相关问题 更多 >