[英]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]])
然后可以與a
和b
垂直堆疊(連接), a
和b
也有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.