如何一次将两个项目添加到列表理解中

How can I add two items to a list copmprehension at once

我有一个像这样的简单 for 循环:

for i in range(3):
    if i == 1:
        for x in [0, 2]:
            free_spots.append([x, i])
    else:
        free_spots.append([1, i])

输出这个列表 [[1, 0], [0, 1], [2, 1], [1, 2]]

我打算像这样将其转换为列表综合,但 运行 变成了一个问题:

[[x, i] for x in [0, 2] if i == 1 else [1, i] for i in range(3)]

这会导致错误,我试过这样修复它:

[[[x, i] for x in [0, 2]] if i == 1 else [1, i] for i in range(3)]

虽然现在运行它,但它也创建了这个: [[1, 0], [[0, 1], [2, 1]], [1, 2]] 我不希望第 2 项和第 3 项一起出现在列表中。有可能做这样的事情吗?: [[0,i],[2,i] if i == 1 else [1, i] for i in range(3)]

您可以分两步完成。

free_spots = [[1, i] for i in range(3)]
free_spots[1:2] = [[x, 1] for x in [0, 2]]

切片赋值相当于for循环中的嵌套循环。

但是,如果循环中有多个异常,这就不能很好地概括。

正如评论中已经指出的那样,创建这样的列表理解语句并不优雅。因此,, a generator中建议的是首选方案。

要使用生成器,您的代码将如下所示:

# Create a generator function
def generate_data():
    for i in range(3):
        if i == 1:
            for x in [0, 2]:
                yield [x, i]
        else:
            yield [1, i]

# Use it
print(list(generate_data()))

如果你真的想一行完成,这个怎么样?

free_spots = [val for sublist in [([[x, i] for x in [0,2]] if i == 1 else [[1, i]]) for i in range(3)] for val in sublist]
# This effectively creates a list of lists containing the values you want
main_list = [([[x, i] for x in [0,2]] if i == 1 else [[1, i]]) for i in range(3)]
# And then flattens it
free_spots = [val for sublist in main_list for val in sublist]

但其他人是对的。除非您有充分的理由,否则这不是一个好主意。我现在几乎无法理解我自己的代码,因为我已经编写了它,这不是 python zen。