如何通过另一个列表的值更改子列表的值

时间:2017-05-31 15:04:16

标签: python python-2.7 python-3.x

这就是我所拥有的:

a = [['a0', '0'], ['a1', '1'], ['a2', '2']]
b = ['b0', 'b1', 'b2']

我想要的是将a中每个子列表的所有第一个值替换为b中的值。所以这将是理想的输出:

d = [['b0', '0'], ['b1', '1'], ['b2', '2']]

这是我的代码:

def make_new_list(a,b):    
    for sublist in a:
        for i in range(len(b)):
             sublist[0] = b[i]        
    return a

这是我用这段代码得到的:

[['b2', '0'], ['b2', '1'], ['b2', '2']]

我做错了什么,如何解决?

5 个答案:

答案 0 :(得分:0)

[[b1, a1[1]] for a1, b1 in zip(a, b)]

答案 1 :(得分:0)

for i in range(0, 3):
    temp = a[i]
    d.append([b[i], temp[1]])

试试

答案 2 :(得分:0)

代码的问题在于构造循环的方式。特别是内部的,对a中的每个子列表执行3次。你不希望出现这种情况。以下是您的脚本的固定版本:

a=[['a0','0'],['a1','1'],['a2','2']]
b=['b0','b1','b2']

def make_new_list(a,b):

    for i, sublist in enumerate(a):
        sublist[0] = b[i]
    return a

print(make_new_list(a, b))  # [['b0', '0'], ['b1', '1'], ['b2', '2']]

更多Pythonic还会如下:

a= [[x[0], x[1][1]] for i, x in enumerate(zip(b, a))]
print(a)  # [['b0', '0'], ['b1', '1'], ['b2', '2']]

答案 3 :(得分:0)

您可以使用zip和列表理解,如下所示:

>>> a=[['a0','0'],['a1','1'],['a2','2']]
>>> b=['b0','b1','b2']
>>> [[bl]+al[1:] for al, bl in zip(a,b)]
[['b0', '0'], ['b1', '1'], ['b2', '2']]

或者,使用numpy切片分配:

>>> import numpy as np
>>> ar=np.array([['a0','0'],['a1','1'],['a2','2']])
>>> ar[:,0]=b
>>> ar
array([['b0', '0'],
       ['b1', '1'],
       ['b2', '2']], 
      dtype='|S2')

答案 4 :(得分:0)

你可以不用拉链试试这个:

a = [['a0', '0'], ['a1', '1'], ['a2', '2']]
b = ['b0', 'b1', 'b2']

new_list = [[b[i], a[i][1]] for i in range(len(b))]