在python中合并1D和2D列表

时间:2016-06-03 01:55:43

标签: python list numpy

我试图将数据设置为转换为numpy数组。我有三个清单。两个是一维的,一个是二维的。

a = [1,2,3]
b = [4,5,6]
c = [ [7,8],[9,10],[11,12] ]

我想最终得到这个:

[ [1,4,7,8],[2,5,9,10],[3,6,11,12] ]

我尝试使用zip(),但它没有深入研究2D数组。

5 个答案:

答案 0 :(得分:4)

假设您不介意在转换本身中使用NumPy,以下情况应该有效。

from numpy import array

a = array([1, 2, 3])
b = array([4, 5, 6])
c = array([[7, 8], [9, 10], [11, 12]])

result = array(list(zip(a, b, c[:, 0], c[:, 1])))

请注意,c[:, n]仅适用于NumPy数组,而不适用于标准Python列表。

答案 1 :(得分:3)

numpy解决方案(根据您的标记)

In [398]: np.vstack([a,b,np.array(c).T]).T
Out[398]: 
array([[ 1,  4,  7,  8],
       [ 2,  5,  9, 10],
       [ 3,  6, 11, 12]])

这会使c成为2x3数组:

In [399]: np.array(c).T
Out[399]: 
array([[ 7,  9, 11],
       [ 8, 10, 12]])

然后可以与ab垂直堆叠(连接),它们也有3个元素。

zip(*c)是转置的列表形式

In [412]: list(zip(a,b,c)) 
Out[412]: [(1, 4, [7, 8]), (2, 5, [9, 10]), (3, 6, [11, 12])]

In [418]: list(zip(a,b,*zip(*c)))
Out[418]: [(1, 4, 7, 8), (2, 5, 9, 10), (3, 6, 11, 12)]

答案 2 :(得分:3)

使用python3就像

一样简单
a = [1,2,3]
b = [4,5,6]
c = [ [7,8],[9,10],[11,12] ]
[[x, y, *z] for x, y, z in zip(a, b, c)]
[[1, 4, 7, 8], [2, 5, 9, 10], [3, 6, 11, 12]]

答案 3 :(得分:1)

如果您想使用标准Python列表进行操作,可以使用zip然后处理每一行:

from itertools import chain

a = [1,2,3]
b = [4,5,6]
c = [[7,8], [9,10], [11,12]]

[list(chain.from_iterable(y if isinstance(y, list) else [y] for y in x)) for x in zip(a, b, c)]

答案 4 :(得分:1)

首先,zip会产生元组,而不是列表,因此您必须将其输出转换为列表:

def lzip(*args):
    'Transforms the tuples yielded by zip into equivalent lists.'
    for tup in zip(*args):
        yield list(tup)
    return

# Later...
a = [1, 2, 3]
b = [4, 5, 6]
c = [
  [7, 8],
  [9, 10],
  [11, 12],
  ]
lzip(a, b)
# A generator that yields: [1, 4], [2, 5], [3, 6]

其次,zip无论如何都不会返回您想要的内容,因为您尝试在c的子列表上执行的操作是连接 ,而不是拉链。

首先,lzip如上例所示的1-d列表,然后将每个子列表与c中的匹配子列表连接起来。

下面,我使用列表推导来构建组合列表,将其分配给变量,使用两个新的局部变量使zip操作更清晰:

heads = lzip(a, b)
tails = c
zipped = [head + tail for head, tail in zip(heads, tails)]
# [[1, 4, 7, 8], [2, 5, 9, 10], [3, 6, 11, 12]]

zip产生包含 n ⁠th头和 n 第四个尾部的2元组:

# First iteration:
([1, 4], [7, 8])
# Next iteration:
([2, 5], [9, 10])
# Last iteration:
([3, 6], [11, 12])

这些元组通过列表推导中的(不可见)赋值head, tail = ...解压缩为两个变量。然后扔掉元组本身。

head + tail连接(“添加”)列表将两个列表合并为一个。在这种情况下,成对的2元素列表将成为单独的4元素列表。

最后,列表推导的[]将4元素列表收集到4个元素列表的单个列表中。