python - 单行嵌套循环

问题描述 投票:2回答:5

什么是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条件的嵌套循环的单行等价物。如果不可能,那么请说明原因!

提前致谢 :)

python python-3.x list list-comprehension
5个回答
2
投票

我想出的是为每个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]

显然,这比嵌套版本更复杂,更难阅读,并且可能表现得更差。


2
投票

这是一个可怕的怪物:

[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]

正如评论中指出的那样,你的循环不应该变得复杂。您应该使用此处的函数来使您的代码更具可读性。它还会使列表推导的使用不那么笨拙。你的目标不应该是“把事情放在一条线上”。您的目标应该是“保持我的代码可读,可维护,简单,诚实”。这个列表理解不是那些东西。

请注意,我不认为这会表现得更好。它需要创建额外的匿名容器或generator \ list-comprehensions(这需要在引擎盖下创建和调用一个函数对象)。

编写代码的目标不应该是“我如何学习编写越来越复杂的列表推导”,而应该是“如何编写和组织我的代码,以便我可以使用简单易懂的列表推导”。


1
投票

我首先尝试以下内容:

[(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]

0
投票

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

[[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迭代很容易:

[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]

0
投票

这就是我提出的:print(list(set([i*j if i % 2 else i+j if i==3 else i for i in range(3, 5) for j in range(0, 2)])))

© www.soinside.com 2019 - 2024. All rights reserved.