我发现列表理解语法非常有用且紧凑。在一直使用它之后,它让我想在列表外使用它,例如我想改变:
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>]
如果我们可以建立列表,是否也可以用于简单的单个对象?“
答案 0 :(得分:5)
你想要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()
结果单独分配到生成器表达式中。该表达式非常难以解析,并且不应仅仅为了想要使用不需要循环的循环而使用此。
答案 1 :(得分:1)
s, intermediate = "sausages hamsters", "and"
print "{1} {0} {2}".format(intermediate, *s.split())
# sausages and hamsters
由于我们使用模板字符串方法,我们也可以根据需要更改中间值。
作为@Martijn suggested,您可以
print " {} ".format(intermediate).join(s.split())
答案 2 :(得分:1)
当然,你可以做类似的事情:
s = "sausages hamsters"
intermediate = " and "
(result,) = [w1 + intermediate + w2 for w1,w2 in [s.split()]]
但是我不能完全确定你这样做会得到什么。上面的join
和format
示例更可取。