“列表理解” - 样式语法外部列表?

时间:2014-03-06 15:40:34

标签: python list-comprehension

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

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 个答案:

答案 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()]]

但是我不能完全确定你这样做会得到什么。上面的joinformat示例更可取。