Skip to main content
 首页 » 编程设计

python之列表外的 "list comprehension"样式语法

2025年05月04日15del

我发现列表理解语法非常有用且紧凑。在一直使用它之后,它让我想在列表之外使用它,例如我想更改:

s="sausages hamsters" 
intermediate=" and " 
word1,word2=s.split() 
s2=word1+intermediate+word2 

进入

word1,word2=s.split() 
s2=word1+intermediate+word2 for word1,word2 in s.split 

显然这行不通。 我在这里遗漏了什么或者这根本无法在一行中完成吗?

编辑:当然这个例子很愚蠢,但在某些情况下我可以看到这节省了不止一行

编辑:我只是写了这个例子,让它读起来更愉快,但我的问题的更多文字版本是:

“有没有办法在一个声明中以这种方式创建变量:

newVar= <expression using still undefined variables> \   
        <some keyword or symbols> \   
         <declaration of pre-cited undefined variables> 

就像列表理解允许做的那样:

newList=[<expression using still undefined variables>   
    for <declaration of pre-cited undefined variables, as result of an iterator>] 

如果我们可以构建列表,是否也可以构建简单的单个对象?”

请您参考如下方法:

你想要str.join()这里:

' and '.join(s.split()) 

每当您想连接多个字符串时,无论字符串之间是否有文本,str.join() 都将是比每个字符串连接更快的选择。

由于 str.join() 采用可迭代参数,您可以根据需要使用生成器表达式和列表推导式。列表理解会更好(因为它是 faster for str.join() )

至于更“通用”的类似列表理解的语法;在生成器表达式、各种理解格式(list、set 和 dict)和 next() 函数之间,您真的不需要更复杂的语法。

请记住,可读性也很重要;不要尝试在循环没有意义的地方应用循环。作为一种反模式,您的“循环中的一个对象”示例可能是:

result = next(a + foo + b for a, b in (s.split(),)) 

我将 s.split() 结果的单独赋值强加到生成器表达式中。该表达式很难解析,您不应该为了在不需要循环的地方使用循环而使用它。