簡體   English   中英

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

[英]Merging 1D and 2D lists in python

我正在嘗試設置數據以轉換為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數組。

假設您不介意在轉換本身中使用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列表。

一個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垂直堆疊(連接), 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)]

使用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]]

如果您想使用標准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)]

對於初學者來說, 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例所示, 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產生2元組,包含n個第 4個頭和第n個尾部:

# 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個元素列表的單個列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM