具有列表理解的python三元迭代

具有列表理解的python三元迭代,python,iteration,list-comprehension,ternary,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') fo

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

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  
您的“实践示例”写为:

>>> strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair']
>>> sum(1 for el in strList if el.startswith('U'))
2
你的另一个例子(如果我理解正确)是:


(或者只需修改
strList
示例,但使用内置方法没有错)

您还可以通过列表理解选择项目,并获取列表中的元素数

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

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

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

expr1 if condition else expr2
条件
的计算结果必须是
bool
。三元表达式选择
expr1
expr2
中的一个,就是它

当我尝试了一个表达式,如
c+=1 if条件else 0
时,我很惊讶它能起作用,并注意到在这个答案的第一个版本中@麦盖伊指出,真正发生的是:

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通过不将赋值视为表达式来避免这种错误


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

这有点低级,但
sum()
将接受
bool
值,将
False
转换为
0
True
转换为
1
。因此,该代码也可以工作:
sum(strList中el的el.startswith('U'))
@steveha:python
bool
int
的子类(出于历史原因);它不是求和,而是简单的整数运算
0+True==1
@MartijnPieters确实-
--True+--False
总是一个好的:)@MartijnPieters,直到它们成为关键词,而不是单例:)@MartijnPieters,好吧,我可以用更好的措辞。如果你想使用len(),那么你必须求助于列表理解,不是吗?或者至少,这是一种方法it@antitrust我认为@Jon是说
sum(generator)
len(list)
更受欢迎,因为你不必建立一个列表,然后进行计数it@antitrust即,
sum(如果k.startswith('U'),则strList中的k为1)
@AlexL Yes-除非你需要一个后面的列表-不要因为它而具体化一个列表
c+=1
不是一个表达式,它是一个赋值。语句将用括号括起来为
c+=(truthy if cond else false)
。您不能在任何其他地方使用
c++=1
,例如
truthy if cond else c++=1
将括号括为
(truthy if cond else c)+=1
,因为您无法指定条件表达式,因此被拒绝。啊,您是对的!我很惊讶它能起作用,但我没有充分考虑到底发生了什么。是时候编辑我的答案了。谢谢你纠正我。
if x = 3:  # syntax error!  Cannot put assignment statement here
    print("x: {}".format(x))