在列表外使用“列表推导式”语法?

1 投票
3 回答
908 浏览
提问于 2025-04-17 21:08

我觉得列表推导式的语法非常实用,而且写起来很简洁。用惯了之后,我就想把它用在其他地方,比如我想把:

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

如果我们可以用它来构建列表,那对于简单的单个对象也是可能的吗?”

3 个回答

1

当然,你可以这样做:

s = "sausages hamsters"
intermediate = " and "
(result,) = [w1 + intermediate + w2 for w1,w2 in [s.split()]]

不过我不太确定这样做有什么好处。上面提到的joinformat的例子更好一些。

1
s, intermediate = "sausages hamsters", "and"
print "{1} {0} {2}".format(intermediate, *s.split())
# sausages and hamsters

因为我们使用了模板字符串的方法,所以我们可以随意改变中间的值。

正如@Martijn提到的,你可以这样做:

print " {} ".format(intermediate).join(s.split())
5

这里你需要用到 str.join() 方法:

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

每当你想把多个字符串连接在一起时,不管中间有没有其他文字,使用 str.join() 会比一个一个字符串拼接要快得多。

因为 str.join() 可以接收一个可迭代的参数,所以你可以随意使用生成器表达式和列表推导式。使用列表推导式会更好一些(因为它在 str.join() 的情况下更快)

至于更“通用”的类似列表推导式的语法,生成器表达式、各种推导式格式(列表、集合和字典)以及 next() 函数的组合,实际上你不需要更复杂的语法。

记住,代码的可读性也很重要;不要在没有必要的地方使用循环。作为一个反面例子,你的“从循环中得到一个对象”的例子可以是:

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

在这里,我把 s.split() 的结果单独赋值放进了生成器表达式的循环里。这个表达式非常难以理解,你不应该这样做,仅仅是为了想用循环而使用循环。

撰写回答