Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,从一行中具有多个条件的另一个元组生成元组_Python_Coding Style_Iteration_Tuples_Code Snippets - Fatal编程技术网

在python中,从一行中具有多个条件的另一个元组生成元组

在python中,从一行中具有多个条件的另一个元组生成元组,python,coding-style,iteration,tuples,code-snippets,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

在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'

现在我想知道是否有类似的情况:

expr = lambda a : some_complex_way_of_evaluating(a)
result = tuple ( expr(a) for a in range(0,10)
如果i%3==0,则范围10中i的元组“a成员”为“其他成员”

因为当我添加else“另一个成员”时,它会失败,并出现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
给我一个元组,它的成员是第一个例子中的行

还有,无论代码是用python 2还是python 3编写的,因为我都可以使用它们来完成我的工作

在或生成器表达式中,修改数据时,条件放在左侧,对于筛选项,条件放在右侧:

>>> 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!')

尝试此方法。您必须将您的条件置于for语句之前:

tuple('Hello!' if i % 3 == 0 else 'Waiting' if i % 3 == 1 else 'Bye!' for i in range(10))
更清楚一点,使用itertools:


对于此特定应用程序:

tuple( ['Hello', 'Waiting', 'Bye!'][ i % 3] for i in range (0, 10))
因为这只是查找问题。尽管列表理解非常棒,但是,如果一行中有多个链接,我觉得非常不和谐。引用

显式比隐式好。简单总比复杂好

在任何情况下,除了最琐碎的情况外,我都会做如下事情:

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

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

因此,如果某个条件也存在,那么我们在sth中用i代替i??因为我在py2和py3中都进行了测试,语法也很有效,但py3的哲学告诉我们,我们想要制作一种语言,让它有一种,而且完全是一种方法来做事情??:困惑的第二种形式也是+1,即使它不在一行中,我也不会那样做@如果某个条件类似于过滤器内置函数,即仅当该条件为真时,才将i放入列表中。如果i%2==0,则类似于i**2,否则i for i在sth中等同于映射内置函数,这里我们根据条件使用修改后的i值。@ARF、py2和py3没有不同的原理。请原谅!我混淆了python和perl!:zZ和我也告诉tanks我们的解释,为什么我们应该在声明之前移动我们的if声明,并且再次感谢记住我,哲学是相同的。而且我打字速度慢,每分钟20分钟,所以请不要认为我想侮辱你;这正是我想要的!这么简单,我得到了第一次阅读的要点,也让我有正确的代码!太多了D@ARF我的荣幸!这就是Python语法的美妙之处——它读起来就像伪代码一样清晰。第二个也是一件好事!我没听说过“itertools”,但它似乎非常有用!也是的!python的简单性导致了一种即使是孩子和新手也非常可读的语言!再次使用TnX获取您提供的第二个代码;使用3的模作为索引的聪明方法!在C++和java中我以前做过这些事情,但是我想理解任何用IF语句做这些事情的语法:D是编程的乐趣,也是Python的乐趣,你可以写一行来做一个在另一个语言的其他语言中等同的东西,甚至可以产生20-30行代码!另外,TnX还提供了使用模运算的漂亮答案!:对于0,10范围内的i,执行elif样式的经典python方法更像{0:'Hello',1:'Waiting',2:'Bye'}[i%3]。字典是python中的一种基本类型,因此在其他语言中使用它们作为switch/case或elif链的等价物是非常常见的。谢谢您提到的字典。它们是好东西!我
expr = lambda a : some_complex_way_of_evaluating(a)
result = tuple ( expr(a) for a in range(0,10)