2015-11-01 109 views
1

我在.csv文件中读取一个列表并添加一个空列表,我使用下面的代码来执行此操作。删除空的嵌套列表 - Python

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] 

这确实删除空巢名单,不过这台包含数据所有其他嵌套列表210即[None, None]。我修改为:

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

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

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

回答

1

我想你想要做的是

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

,这使得仅包含非空列表中tscores

+0

Bah,它的工作原理!谢谢! – PairedPrototype

0

替代user2990008's answer列表,你不能在第一时间创建空列表:

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

这似乎也是一个很好的答案,也许是最合适的。编辑:这绝对有效。 – PairedPrototype

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)] 

...记住你的列表理解可以处理可选的条件子句过滤。这只有在确保列表中每个元素都支持函数的情况下才有效(当然,您可以通过使用更复杂的条件来确保这一点,例如:hasattr(r,'LEN“)和len(R)

注:这只是测试深度的水平......这是递归

0

只是为了完整性:在这种情况下,我认为名单内涵是不是最简单的解决方案,这里函数式编程会有意义,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功能和返回的列表只包含元素a当且仅当满足条件len(x) > 0。因此返回一个没有嵌套空列表的列表。

+0

嗯...'过滤器(lambda x:len(x)> 0,a)'在各方面都比'[x for x in a len(x)> 0]'糟糕 - 对于同样的效果。 – Claudiu

+0

在Python中它应该比较慢,因为函数调用效率低下,是的 - 通常取决于实现。然而,为了过滤的目的,我(个人)喜欢这个,因为它更直观。这种情况就像'filter()'的最默认情况之一。无可否认,这是一个基于意见的决定,只是我的想法。 – daniel451

+0

是的,我倾向于做的是如果函数已经存在/被定义在其他地方,我使用'filter' /'map'(例如'map(str.strip ,而不是'[x for maybe_gorms,如果is_gormed(x)]'),但如果我需要的话,而不是'[x.strip()for strs]','filter(is_gormed,maybe_gorms)''一个表达式然后我使用列表解析。即使使用map/filter,人们也可能不同意 - 列表理解对眼睛来说更容易(可能是主观的),并且更常用 – Claudiu