2013-02-01 93 views
3

三元迭代可能吗?我的意思一个简单的版本,但这个特殊的例子可以以更好的方式来完成:python与列表理解三元迭代

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 

回答

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

这有点低俗,但'sum()'会接受一个'bool'值,将'False'转换为'0'和'True'转换为'1'。因此,这个代码也可以工作:'sum(el.startswith('U')for el in strList)' – steveha

+1

@steveha确实可以工作,但我更喜欢显式的:) –

+0

@steveha:python'bool'是一个子类'int'(出于历史原因);它不是“总和”转换它,而是简单的整数算术; '0 + True == 1'。 –

0

您也可以选择带有列表理解您的项目,并采取在列表中元素的个数。

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

没有必要为此建立一个'list' ... –

+1

如果你想使用len(),那么你必须使用列表理解,不是吗?或至少,这是一种方法来做到这一点 – octoback

+0

@antitrust我认为@Jon是说'sum(generator)'比'len(list)'更受青睐,因为你不必建立一个列表然后计数它 –

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

'c + = 1'不是一个表达式,它是一个赋值。该语句将加括号为'c + =(truthy if cond else falsey)'。你可以*不*在其他地方使用'c + = 1',例如'truthy if cond else c + = 1'加括号为'(truthy if cond else c)+ = 1',因为你可以'分配给条件表达式。 – SingleNegationElimination

+0

啊,你是对的!我很惊讶,它的工作,但我没有足够的关于真正发生的事情。那么,请编辑我的答案。谢谢你纠正我。 – steveha