python-循环的单行嵌套

python-循环的单行嵌套,python,python-3.x,list,list-comprehension,Python,Python 3.x,List,List Comprehension,python单行代码与下面的代码是什么 l=[] for i in range(3,5) : if i==3: for j in range(0,2): if i%2: l.append(i*j) else: l.append(i+j) else: l.append(i) print(l) 我尝试对嵌套循环使用单行,但只有一个条件如下:

python单行代码与下面的代码是什么

l=[]
for i in range(3,5) :
    if i==3:
        for j in range(0,2):
            if i%2:
                l.append(i*j)
            else:
                l.append(i+j)
    else:
        l.append(i)
print(l)
我尝试对嵌套循环使用单行,但只有一个条件如下:

print([i*j if i%2 else i+j for i in range(3,5) for j in range(0,2)])
注意:在这里,我想学习如何对两个循环中都带有if-else条件的嵌套循环使用单线等效。 如果不可能,请说明原因


提前感谢:)

我想先试试下面的方法:

[(i*j if i % 2 and i==3
  else i+j if i==3
  else i)
 for j in range(0, 2)
 for i in range(3, 5)]
嵌套列表理解语法可能会变得非常混乱。这是输出:

[0, 4, 3, 4]
我想您可以将此设置为一组以删除重复:

result = list(set(result))
# where result is the list above 

[0, 3, 4]

我想到的是为每个
I
生成一个序列,然后有一个封闭的理解,将它们展平到一个列表中:

[x for y in ((i*j if i%2 else i+j for j in range(0, 2)) if i == 3 else (i,) for i in range(3, 5)) for x in y]
# [0, 3, 4]

显然,这比嵌套版本更复杂、更难阅读,而且可能执行得更差。

下面是一个可怕的怪物:

[x for i in range(3,5) for x in ([i*j if i%2 else i+j for j in range(2)] if i==3 else (i,))]
我正在努力使其可读:

In [12]: result = [
    ...:     x
    ...:     for i in range(3, 5)
    ...:     for x in ((i*j if i%2 else i+j for j in range(2))
    ...:               if i ==3 else (i,))
    ...: ]

In [13]: print(result)
[0, 3, 4]
正如评论中指出的,你的循环不应该变得如此复杂。您应该在这里使用函数来提高代码的可读性。它还将减少列表理解的使用。你的目标不应该是“让事情保持一致”,你的目标应该是“让我的代码可读、可维护、简单、诚实”。这份清单不是这些东西

请注意,我并不期望它表现得更好。它需要创建额外的匿名容器或生成器\列表理解(这需要在引擎盖下创建和调用函数对象)


您编写代码的目标不应该是“如何学习编写日益复杂的列表理解”,而应该是“如何编写和组织代码,以便使用简单易读的列表理解”。

您可以将内部部分转换为一系列列表:

[[i * j if i % 2 else i + j for j in range(2)] if i == 3 else [i] for i in range(3,5)]
在一般情况下,展开2D iterable很容易:

[e for row in iterable for e in row]
将两者结合起来:

[e for row in [[i * j if i % 2 else i + j for j in range(2)] if i == 3 else [i] for i in range(3,5)] for e in row]
使用生成器可以避免存储中间列表:

[e for row in ((i * j if i % 2 else i + j for j in range(2)) if i == 3 else [i] for i in range(3,5)) for e in row]

这就是我想到的:
打印(列表(设置([i*j如果i%2,否则i+j如果i==3,否则i代表范围(3,5)中的i代表范围(0,2))中的j))

大多数代码不应达到这种复杂性。如果是这样的话,最好还是像以前那样编写,以保持功能性和可读性。列表理解(这是它们的实际名称)更适合于更简单的循环和条件。我真的很喜欢这个问题。Python确实使嵌套变得更加困难。我同意,这很有趣,但我肯定必须打开我的解释器,开始尝试完善语法。三级嵌套非常传统,但Python没有优先考虑这一点(求助于理解只会使代码更加模糊)将其转换为一个集合,然后返回到一个列表,尽管这种方法的可靠性不高。这不是增加了循环的数量,从而增加了代码的时间复杂度吗?是的,我知道可读性应该是第一位的,但我还想学习如何在两个循环中使用if-else块的列表理解。我的意思是ou好奇的t想知道if语句将放在哪里。@Trifrostmaster“这不是增加了循环的数量,从而增加了代码的时间复杂性吗”不,增加循环并不意味着增加复杂性。这是经验法则,不是逻辑含义。时间复杂性是相等的,(尽管如此,我认为实际运行时更倾向于for循环版本,而不是滥用列表-comprehension@Trifrostmaster从学术的角度来看,这很好,但是你不应该在生产代码中使用这一点。这就是我想说的,因为我觉得这是一种责任,因为这些问题经常被试图o为产品编写代码。这类事情会让你在适当的代码审查中受到谴责。