因为我们在python中有如下语法:
for i in range(10):
print 'Hello!' if i % 3 == 0 else 'Waiting' if i % 3 == 1 else 'Bye!'
将产生如下输出:
Hello!
Waiting
Bye!
Hello!
Waiting
Bye!
Hello!
Waiting
Bye!
Hello!
我们也有这个:
a = tuple('a member' for i in range(10) if i % 3 == 0)
创建一个像('a member', 'a member', 'a member', 'a member')
现在我想知道是否有类似的东西:
a = tuple('a member' for i in range(10) if i % 3 == 0 else 'another member')
?
因为当我添加else 'another member'
时,它失败并出现SyntaxError Exception
这是python控制台输出:
>>> a = tuple('a member' for i in range(10) if i % 3 == 0 else 'another member')
File "<stdin>", line 1
a = tuple('a member' for i in range(10) if i % 3 == 0 else 'another member')
^
SyntaxError: invalid syntax
(我确实只想写一行代表:
a = tuple('Hello!' for i in range(10) if i % 3 == 0 else 'Waiting' if i % 3 == 1 else 'Bye!')
并留下一个元组,其成员是第一个例子中的行
此外,无论代码是在python 2还是3中,因为我可以同时处理我的工作;))
答案 0 :(得分:3)
试试这个(你必须在for
陈述之前提出你的条件):
tuple('Hello!' if i % 3 == 0 else 'Waiting' if i % 3 == 1 else 'Bye!' for i in range(10))
使用itertools
:
from itertools import cycle, islice
tuple(islice(cycle(('Hello!', 'Waiting', 'Bye!')), 10))
答案 1 :(得分:0)
在修改数据的list comprehension或生成器表达式中,条件放在左侧,对于过滤项,将条件放在右侧:
>>> tuple('Hello!' if i % 3 == 0 else 'Waiting' if i % 3 == 1 else 'Bye!'
for i in xrange(10))
('Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!')
上述代码的可读版本:
>>> lis = ['Hello!', 'Waiting' ,'Bye!']
>>> tuple( lis[i%3] for i in xrange(10) )
('Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!')
#or
>>> from itertools import cycle
>>> cyc = cycle(lis)
>>> tuple(next(cyc) for _ in xrange(10))
('Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!', 'Waiting', 'Bye!', 'Hello!')
答案 2 :(得分:0)
针对此特定应用:
tuple( ['Hello', 'Waiting', 'Bye!'][ i % 3] for i in range (0, 10))
因为它只是查找问题。尽管列表理解很棒,但是在一行中有多个链接的if-elses让我觉得非常单调。引用Pep 20:
明确比隐含更好。简单比复杂更好。
除了最微不足道的情况之外,我会做类似的事情:
expr = lambda a : some_complex_way_of_evaluating(a)
result = tuple ( expr(a) for a in range(0,10)
因此列表comp语法,范围语法和评估表达式并非都在一行中争夺注意力