-1

因为我们在 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 异常而失败

这是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 中,因为我可以同时使用两者来完成我的工作;))

4

3 回答 3

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))
于 2013-08-05T01:54:57.700 回答
0

列表推导或生成器表达式中,修改数据时,条件放在左侧,对于过滤项目,条件放在右侧:

>>> 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!')
于 2013-08-05T01:54:55.850 回答
0

对于这个特定的应用程序:

tuple( ['Hello', 'Waiting', 'Bye!'][ i % 3] for i in range (0, 10))

因为这只是查找问题。尽管列表推导很棒,但是,单行中的多个链式 if-else 让我觉得非常不合 Python。引用Pep 20:

显式优于隐式。简单胜于复杂。

在除了最微不足道的情况下,我会做类似的事情:

expr = lambda a : some_complex_way_of_evaluating(a)
result = tuple ( expr(a) for a in range(0,10)

因此,list comp 语法、范围语法和求值表达式并非都在一行中争夺注意力

于 2013-08-05T02:07:17.997 回答