在python的一行中从另一个具有多个条件的元组创建元组

时间:2013-08-05 01:52:43

标签: python coding-style iteration tuples code-snippets

因为我们在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中,因为我可以同时处理我的工作;))

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语法,范围语法和评估表达式并非都在一行中争夺注意力