什么是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
生成一个序列,然后有一个封闭的理解将它们压缩成一个列表:
[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]
正如评论中指出的那样,你的循环不应该变得复杂。您应该使用此处的函数来使您的代码更具可读性。它还会使列表推导的使用不那么笨拙。你的目标不应该是“把事情放在一条线上”。您的目标应该是“保持我的代码可读,可维护,简单,诚实”。这个列表理解不是那些东西。
请注意,我不认为这会表现得更好。它需要创建额外的匿名容器或generator \ list-comprehensions(这需要在引擎盖下创建和调用一个函数对象)。
编写代码的目标不应该是“我如何学习编写越来越复杂的列表推导”,而应该是“如何编写和组织我的代码,以便我可以使用简单易懂的列表推导”。
我首先尝试以下内容:
[(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 * 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]
这就是我提出的: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)])))