python-单行嵌套循环

时间:2018-09-15 20:57:38

标签: 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)

我尝试对嵌套循环使用单行,但仅具有以下一种条件:

print([i*j if i%2 else i+j for i in range(3,5) for j in range(0,2)])

注意:在这里,我想学习如何在嵌套循环中使用等价的单循环嵌套循环。 另外,如果不可能,请指定原因!

预先感谢:)

5 个答案:

答案 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)])))