3

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

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

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

这完全消除了所有嵌套列表。

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

4

5 回答 5

1

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

要“自动”迭代列表并过滤特定元素,您可以使用内置函数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满足时的元素。因此返回一个没有嵌套空列表的列表。

于 2015-11-02T00:05:08.683 回答
1

我想你想做的是

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

它仅列出 tscores 中的非空列表

于 2015-11-01T23:49:56.473 回答
1

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

tscores = [[str(e) for e in r] for r in reader if len(r) > 0]
于 2015-11-01T23:54:45.327 回答
0
tscores = [x for x in tscores if x]

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

于 2018-05-31T12:09:04.910 回答
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 ') 和长度(r)

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

于 2015-11-01T23:55:19.983 回答