【发布时间】:2018-07-05 21:39:08
【问题描述】:
我定义了一个这样的嵌套列表:
T=[[0 for i in range(4)] for i in range(4)]
现在要为每个子列表的第一个元素分配一个值,例如10。
我试过这个:T[:][0] = 10,但它不起作用。我知道这可以使用循环来完成,但有没有更简单的方法?
【问题讨论】:
我定义了一个这样的嵌套列表:
T=[[0 for i in range(4)] for i in range(4)]
现在要为每个子列表的第一个元素分配一个值,例如10。
我试过这个:T[:][0] = 10,但它不起作用。我知道这可以使用循环来完成,但有没有更简单的方法?
【问题讨论】:
您可以在推导式中使用三元 x if y else z 运算符:
T = [[0 if i else 10 for i in range(4)] for _ in range(4)]
由于int 是不可变的,你也可以这样做:
T = [[10] + [0] * 3 for _ in range(4)]
【讨论】:
要存储10,可以使用列表连接:
T=[[10]+[0 for i in range(3)] for i in range(4)]
输出:
[[10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0]]
或者,在 Python3 中,您可以使用更简洁的列表解包 *:
T=[[10, *[0 for _ in range(3)]] for i in range(4)]
输出:
[[10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0]]
【讨论】:
您可以使用内置的map 函数在每个子列表的开头分配10。
>>> l = [[0 for i in range(4)] for i in range(4)]
>>> list(map(lambda x, y: x+y[1:], [[10]]*len(l), l))
>>> [[10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0]]
【讨论】:
您可以尝试使用 lambda:
list(map(lambda x:x.__setitem__(0,10),T))
print(T)
输出:
[[10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0]]
【讨论】: