有没有方法逐个索引合并多个列表?
比如说,我有三个长度相同的列表:
A = [1,2,3]
B = [a,b,c]
C = [x,y,z]
我想把它们合并成这样:
[[1,a,x],[2,b,y],[3,c,z]]。
这是我目前的代码:
define merger(A,B,C):
answer =
for y in range (len(A)):
a = A[y]
b = B[y]
c = C[y]
temp = [a,b,c]
answer = answer.extend(temp)
return answer
但是我收到了一个错误:
'NoneType'对象没有'extend'这个属性。
4 个回答
我也在想同样的问题。我还是个编程新手,正在使用代码学院学习。这是我想到的,如何在指定的位置把两个列表合并在一起。
toppings = ['pepperoni', 'pineapple', 'cheese', 'sausage', 'olives', 'anchovies', 'mushrooms']
prices = [2,6,1,3,2,7,2]
num_pizzas = len(toppings)
print("We sell "+str(num_pizzas)+" different kinds of pizza!")
***pizzas = list(zip(toppings, prices))***
print (pizzas)
打印出来的列表 pizzas 是 ...[('意大利香肠', 2), ('菠萝', 6), ('奶酪', 1), ('香肠', 3), ('橄榄', 2), ('凤尾鱼', 7), ('蘑菇', 2)]
假设你这样做是为了上课,而不是学习所有让Python变得很棒的小技巧,那么你需要了解的就是这些。你遇到了两个问题,首先如果你想要扩展,那就要在原地进行,但你想要的结果显示你其实是想要添加,而不是扩展。
def merger(A,B,C):
answer = []
for y in range (len(A)):
a=A[y]
b=B[y]
c=C[y]
temp = [a,b,c]
answer.append(temp)
return answer
>>> answer
[[1, 'a', 'x'], [2, 'b', 'y'], [3, 'c', 'z']]
要获取一个列表的列表,你可以使用内置的函数zip()
,然后结合列表推导式把zip()
的结果中的每个元素从元组
转换成列表
:
A = [1, 2, 3]
B = [4, 5, 6]
C = [7, 8, 9]
X = [list(e) for e in zip(A, B, C,)]
print X
>>> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
看起来你的代码是想要写成 answer = []
,如果不写这个,可能会出问题。不过你最大的麻烦在于这里:
answer = answer.extend(temp)
extend
是用来 修改 answer
的,并且返回的是 None。你只需要写成 answer.extend(temp)
就可以了,这样就能正常工作了。你可能还想用 append
方法,而不是 extend
。因为 append
是把 一个对象(也就是列表 temp
)放到 answer
的最后面,而 extend
是把 temp 里的每一个元素都单独放进去,最终得到的结果是你想要的扁平化列表: [1, 'a', 'x', 2, 'b', 'y', 3, 'c', 'z']
。
不过,与其重新发明轮子,不如直接用 Python 自带的 zip
函数,这正是它的用途:
>>> A = [1,2,3]
>>> B = ['a', 'b', 'c']
>>> C = ['x', 'y', 'z']
>>> list(zip(A, B, C))
[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
需要注意的是,在 Python 2 中,zip
返回的是一个元组的列表;而在 Python 3 中,它返回的是一个懒惰的迭代器(也就是说,它会在你需要的时候才生成元组,而不是提前计算好)。如果你想在 Python 3 中得到 Python 2 的行为,可以像我上面那样通过 list
来处理。如果你想在 Python 2 中得到 Python 3 的行为,可以使用来自 itertools 的 izip
函数。