python三元迭代与列表理解

时间:2013-02-01 02:41:29

标签: python iteration list-comprehension ternary

三元迭代是否可行?我的意思的简单版本,虽然这个特定的例子可以更好的方式完成:

c = 0  
list1 = [4, 6, 7, 3, 4, 5, 3, 4]  
c += 1 if 4 == i for i in list1 else 0  

更实际的例子:

strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair']
counter = 0  
counter += 1 if True == i.startswith('U') for i in strList else 0  
return counter  

3 个答案:

答案 0 :(得分:5)

你的“实际例子”写成:

>>> strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair']
>>> sum(1 for el in strList if el.startswith('U'))
2

你的另一个例子(如果我理解正确的话)是:

>>> list1 = [4, 6, 7, 3, 4, 5, 3, 4]
>>> list1.count(4)
3

(或者仅调整strList示例,但使用内置方法没有任何问题)

答案 1 :(得分:1)

@Jon Clements给了你一个很好的答案:如何使用Python成语来解决问题。如果其他Python程序员查看他的代码,他们会立即理解它。这是使用Python完成它的正确方法。

回答你的实际问题:不,那不行。三元运算符具有以下形式:

expr1 if condition else expr2

condition必须是评估为bool的内容。三元表达式选择expr1expr2中的一个,就是这样。

当我尝试像c += 1 if condition else 0这样的表达时,我感到惊讶它有效,并注意到在这个答案的第一个版本中。 @TokenMacGuy指出,真正发生的事情是:

c += (1 if condition else 0)

所以你不能做你想做的事,即使你处于适当的状态而不是某种循环。上述情况可行,但这样的事情会失败:

c += 1 if condition else x += 2  # syntax error on x += 2

这是因为Python不会将赋值语句视为表达式。

你不能犯这个常见的错误:

if x = 3:  # syntax error!  Cannot put assignment statement here
    print("x: {}".format(x))

程序员可能希望x == 3测试该值,但输入x = 3。 Python不会将赋值视为表达式,从而避免了这个错误。

你不能错误地做,也不能故意这样做。

答案 2 :(得分:0)

您还可以选择具有列表推导的项目,并获取列表中的元素数量。

strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair']
len([k for k in strList if k.startswith('U')])