删除空的嵌套列表 - 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
中的 none 个空列表
替代,您不能首先创建空列表:
tscores = [[str(e) for e in r] for r in reader if len(r) > 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)
注意:这只测试一层深度...它不是递归的。
只是为了完整性:在这种情况下,我认为列表理解不是最简单的解决方案。在这里函数式编程是有意义的,恕我直言。
要 "automatically" 遍历列表并过滤特定元素,您可以使用内置函数 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
满足了。因此返回一个没有嵌套空列表的列表。
tscores = [x for x in tscores if x]
如果列表为空,则条件 return 为假,因此不会包含在 tscores
.
中
我正在将 .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
中的 none 个空列表替代
tscores = [[str(e) for e in r] for r in reader if len(r) > 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)
注意:这只测试一层深度...它不是递归的。
只是为了完整性:在这种情况下,我认为列表理解不是最简单的解决方案。在这里函数式编程是有意义的,恕我直言。
要 "automatically" 遍历列表并过滤特定元素,您可以使用内置函数 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
满足了。因此返回一个没有嵌套空列表的列表。
tscores = [x for x in tscores if x]
如果列表为空,则条件 return 为假,因此不会包含在 tscores
.