这个循环可以理解Pythonic列表吗?

这个循环可以理解Pythonic列表吗?,python,loops,list-comprehension,Python,Loops,List Comprehension,我对列表理解有爱/恨的关系。一方面,我认为它们整洁优雅。另一方面,我讨厌读它们。(特别是那些我没有写的)我通常遵循的规则是,让它可读,直到需要速度。所以我的问题在这一点上是很学术的 我想要一张表中的电台列表,其中的字符串通常有额外的空格。我需要把那些空间去掉。有时这些电台是空白的,不应包括在内 stations = [] for row in data: if row.strip(): stations.append(row.strip()) 这可以转化为以下列表:

我对列表理解有爱/恨的关系。一方面,我认为它们整洁优雅。另一方面,我讨厌读它们。(特别是那些我没有写的)我通常遵循的规则是,让它可读,直到需要速度。所以我的问题在这一点上是很学术的

我想要一张表中的电台列表,其中的字符串通常有额外的空格。我需要把那些空间去掉。有时这些电台是空白的,不应包括在内

stations = []
for row in data:
    if row.strip():
        stations.append(row.strip())
这可以转化为以下列表:

这已经足够好了,但我突然想到我已经做了两次脱衣舞了。我猜.strip()实际上不需要两次,而且通常比只分配变量慢。

结果证明我是对的

> Striptwice list comp 14.5714301669     
> Striptwice loop 17.9919670399
> Striponce loop 13.0950567955
时间显示在两个环路段之间,第二个(带一次)更快。这里没有真正的惊喜。我感到惊讶的是,列表理解只是稍微慢了一点,即使它做了两次连环画

我的问题:有没有一种方法可以编写一个只做一次的列表理解?



结果:

以下是这些建议的时间结果

# @JonClements & @ErikAllik
> Striptonce list comp 10.7998494348
# @adhie
> Mapmethod loop 14.4501044569

有-首先创建剥离字符串的生成器,然后使用该生成器:

stations = [row for row in (row.strip() for row in data) if row]
您也可以在不使用comp的情况下编写它,例如(对于python2.x,切换到
imap
并删除
list
):


嵌套理解可能很难阅读,因此我的第一个偏好是:

stripped = (x.strip() for x in data)
stations = [x for x in stripped if x]
或者,如果您内联
stripped
,您将得到一个(嵌套的)列表:

stations = [x for x in (x.strip() for x in data) if x]

注意,第一个/内部理解实际上是一个生成器表达式,换句话说,它是一个惰性列表理解;这是为了避免重复两次。

使用map()将strip应用于所有元素,然后进行筛选

[item for item in map(lambda x: x.strip(), list) if item]

Python公约/社区既不需要也不鼓励
map()
;另外,您的代码进行2次迭代,然后将其转换为列表理解表单。在某些函数式语言中,map更懒惰。
map
在Python中不是懒惰的,但是
itertools.imap
是懒惰的。@ErikAllik我要补充的是,它在Python 3.x中是懒惰的。但是,在2.6+版本中,它也可能是懒惰的,因为有来自未来的
内置导入映射
,所以
None
基本上代表ID函数(
lambda x:x
)?不知道这样的捷径;谢谢顺便说一句,
list(…)
调用不是必需的。@ErikAllik对于Python3.x来说是。。。我注意到Python2.x应该删除它,并且
map
被替换为
imap
:)我有点自责了。我应该先看看@JonClements的例子。基本上是在列表上循环两次。非常好,先生。@JonClements-我在让你的第二个示例在2.7中运行时遇到了问题(这是我主要使用的)。类似地,
def stripped(iter):return(iter中x的x.strip())
,然后你可以编写
stations=list(x代表x,如果x是数据)
,如果以后再次使用
stripped
,这是有意义的。@SteveJessop尽管命名参数
iterable
更为常规,更重要的是避免隐藏函数中的内置
iter
。@JonClements:agreed。为我辩护,我身体不好。我不工作可能是最好的选择。我很好奇建议的答案与你的测试相比在时间上如何。你会接受任何答案吗?我会的。我今天早上刚回到我的帖子,整个周末都没看任何东西。不能接受两个答案。我完全支持弱者,所以荣誉归于@ErikAllik,尽管JonClements也同样正确。
stripped = (x.strip() for x in data)
stations = [x for x in stripped if x]
stations = [x for x in (x.strip() for x in data) if x]
[item for item in map(lambda x: x.strip(), list) if item]