如何一次将两个项目添加到列表理解中
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。
我有一个像这样的简单 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
循环中的嵌套循环。
但是,如果循环中有多个异常,这就不能很好地概括。
正如评论中已经指出的那样,创建这样的列表理解语句并不优雅。因此,
要使用生成器,您的代码将如下所示:
# 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。