列表理解与重复的函数调用

pet*_*zik 15 python list-comprehension

我想转换一个字符串,如下所示:

'   1   ,   2  ,    ,   ,   3   '
Run Code Online (Sandbox Code Playgroud)

进入非空元素列表:

['1', '2', '3']
Run Code Online (Sandbox Code Playgroud)

我的解决方案是这个列表理解:

print [el.strip() for el in mystring.split(",") if el.strip()]
Run Code Online (Sandbox Code Playgroud)

只是想知道,有没有一种漂亮的,pythonic的方式来写这种理解而不需要el.strip()两次打电话?

Wil*_*sem 20

您可以在列表解析中使用生成器:

  [x for x in (el.strip() for el in mylist.split(",")) if x]
#             \__________________ ___________________/
#                                v
#                        internal generator
Run Code Online (Sandbox Code Playgroud)

因此,生成器将提供剥离的元素,并且我们遍历生成器,并且仅检查真实性.因此,我们节省了el.strip()电话费.

您也可以使用map(..)它(使其更具功能性):

  [x for x in map(str.strip, mylist.split(",")) if x]
#             \______________ ________________/
#                            v
#                           map
Run Code Online (Sandbox Code Playgroud)

但这基本上是相同的(尽管生成器的逻辑 - 在我看来 - 更好地封装).


Rom*_*est 8

作为获取非空元素列表的简单替代方法(除了以前的好答案):

import re

s = '   1   ,   2  ,    ,   ,   3   '
print(re.findall(r'[^\s,]+', s))
Run Code Online (Sandbox Code Playgroud)

输出:

['1', '2', '3']
Run Code Online (Sandbox Code Playgroud)


Mir*_*j50 5

如何regex从字符串中提取所有数字

import re

a = '   1   ,   2  ,    ,   ,   3   '
print(re.findall(r'\d+', a))
Run Code Online (Sandbox Code Playgroud)

输出:

['1', '2', '3']
Run Code Online (Sandbox Code Playgroud)