以下代码的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)])
注意:在这里,我想学习如何在嵌套循环中使用等价的单循环嵌套循环。 另外,如果不可能,请指定原因!
预先感谢:)
答案 0 :(得分: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]
显然,这比嵌套版本更复杂,更难以阅读,并且执行起来可能更差。
答案 1 :(得分: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]
正如评论中所指出的那样,您的循环不应该变得如此复杂。您应该在此处使用函数以使代码更具可读性。这也将使列表理解的使用不太麻烦。您的目标不应是“将事情保持一线”。您的目标应该是“保持我的代码可读,可维护,简单且诚实”。列表理解并不是这些。
请注意,我不希望它的效果更好。它需要创建额外的匿名容器或generators \ list-comprehensions(这需要在内部创建并调用函数对象)。
您编写代码的目标不应是“如何学习编写日益复杂的列表推导”,而应该是“如何编写和组织代码,以便可以利用简单易懂的列表推导” “。
答案 2 :(得分: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]
答案 3 :(得分: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]
答案 4 :(得分: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)])))