在列表外使用“列表推导式”语法?
我觉得列表推导式的语法非常实用,而且写起来很简洁。用惯了之后,我就想把它用在其他地方,比如我想把:
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()]]
不过我不太确定这样做有什么好处。上面提到的join
和format
的例子更好一些。
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()
的结果单独赋值放进了生成器表达式的循环里。这个表达式非常难以理解,你不应该这样做,仅仅是为了想用循环而使用循环。