因此,使用以下方法确定列表子列表的长度非常容易:
list_length = [len(w) for w in data]
但有没有办法在忽略任何空列表条目的情况下获取长度:''
?
我有一个列表列表[data]
,其中一个子列表如下所示:
['GOM COD', '60', '$2.00', '', '$120.00']
因此list_length
被确定为5
。到目前为止,我会将列表列表转换为单个列表,以便删除所有''
条目,然后根据list_length
的值将其转回列表列表。但是,在这种情况下,删除所有''
后,list_length
的{{1}}值最终会变得不正确并创建一个混乱的DataFrame。
我尝试使用5
删除所有空字符串条目,但只删除那些完全由data = list(filter(None, data))
组成的子列表。
所以我希望最终能够在忽略或排除''
的同时确定子列表的长度,因为我必须在许多文件上运行此代码,因此它必须足够强大才能读取正确的''
。
我可以提出什么问题?甚至是最聪明的方法呢?
感谢。
答案 0 :(得分:5)
好像你正在将filter
应用于错误的级别。在大多数情况下,我个人更喜欢列表理解而不是filter
:
[len([x for x in w if x != '']) for w in data]
使用过滤器:
[len(list(filter(None, w))) for w in data]
修改强>
这样更有效,因为它不必构建新列表:
[sum(1 for x in w if x != '') for w in data]
要清除评论中发生的混淆,请记住我们已经获得列表。这是一个有效的输入:
data = [
['a', 'b', 'c'],
['d', '', 'e'],
]
上述任何表达式data
的值都是[3, 2]
,因为第一个子列表有3个非空字符串,第二个子列表有2个非空字符串。
答案 1 :(得分:1)
使用地图,
data = ['GOM COD', '60', '$2.00', '', '$120.00']
[x for x in map(len, data) if x!=0]
或使用过滤器:
[len(x) for x in list(filter(lambda x: x != '', data))]
或使用地图和过滤器:
map(len, list(filter(lambda x: x != '', data)))
使用列表理解:
[len(x) for x in data if x!=""]