2014-01-24 143 views
2

如何将一个列表中的每个项目追加到另一个列表的每个子列表中?将值列表附加到子列表

a = [['a','b','c'],['d','e','f'],['g','h','i']] 
b = [1,2,3] 

的结果应该是:

[['a','b','c',1],['d','e','f',2],['g','h','i',3]] 

请记住,我想这样做是为了一个非常大名单,因此效率和速度是非常重要的。

我已经试过:

for sublist,value in a,b: 
    sublist.append(value) 

返回 'ValueError异常:值过多解压'

或许LISTINDEX或可能的ListIterator工作,但不知道如何在这里适用

回答

4
a = [['a','b','c'],['d','e','f'],['g','h','i']]    
b = [1,2,3] 

for ele_a, ele_b in zip(a, b): 
    ele_a.append(ele_b) 

结果:

>>> a 
[['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]] 

你原来的解决方案没有工作的原因,是a,b并创造一个tuple,但不是你想要的。

>>> z = a,b 
>>> type(z) 
<type 'tuple'> 
>>> z 
([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], [1, 2, 3]) 
>>> len(z[0]) 
3 
>>> for ele in z: 
... print ele 
... 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']] #In your original code, you are 
[1, 2, 3]           #unpacking a list of 3 elements 
                #into two values, hence the 
                #'ValueError: too many values to unpack' 

>>> zip(a,b) # using zip gives you what you want. 
[(['a', 'b', 'c'], 1), (['d', 'e', 'f'], 2), (['g', 'h', 'i'], 3)] 
0

使用列表理解的一个选项:

a = [(a[i] + b[i]) for i in range(len(a))] 
+0

这将取代'用新的了'包含新列表的列表。在这种情况下,最终的结果将是相同的,但创建一堆新列表会有点低效。 – kojiro

0

只是循环通过子列表,添加一个项目在一个时间:

for i in range(0,len(listA)): 
     listA.append(listB[i]) 
+0

而不是使用'range',可以考虑在这里使用'enumerate(listA)'。 '对于我,el_a列举(a):el_a.append(b [i])'我认为是你的意思。 – kojiro

0

你可以这样做:

>>> a = [['a','b','c'],['d','e','f'],['g','h','i']] 
>>> b = [1,2,3] 
>>> [l1+[l2] for l1, l2 in zip(a,b)] 
[['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]] 

您也可以滥用列表内涵的副作用得到这个地方做:

>>> [l1.append(l2) for l1, l2 in zip(a,b)] 
[None, None, None] 
>>> a 
[['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]]