有没有方法逐个索引合并多个列表?

5 投票
4 回答
19509 浏览
提问于 2025-04-17 23:34

比如说,我有三个长度相同的列表:

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 个回答

0

我也在想同样的问题。我还是个编程新手,正在使用代码学院学习。这是我想到的,如何在指定的位置把两个列表合并在一起。

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)]

1

假设你这样做是为了上课,而不是学习所有让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']]
8

要获取一个列表的列表,你可以使用内置的函数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]]
10

看起来你的代码是想要写成 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 函数。

撰写回答