4

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

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  
4

3 回答 3

6

你的“实际例子”写成:

>>> 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例子,但使用内置方法没有错)

于 2013-02-01T02:44:05.177 回答
1

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

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

expr1 if condition else expr2

condition必须是评估为 a 的东西bool。三元表达式选择 and 之一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 通过不将赋值视为表达式来避免此错误。

你不能做错,你也不能故意做。

于 2013-02-01T03:01:39.600 回答
0

您还可以使用列表理解选择您的项目,并获取列表中的元素数量。

strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair']
len([k for k in strList if k.startswith('U')])
于 2013-02-01T02:52:17.830 回答