[英]Python create tuple of arrays' zip from variable length dictionary of arrays
標題可能過於復雜。
我正在嘗試做的是以下內容:
給定 arrays 的字典
h = {'full':[10, 8, 6, 4, 2],'train':[12, 10, 8, 6, 4],'test':[8,6,4,2, 0]}
我想得到 arrays 的所有元素的元組,其中第一個元素取自第一個數組的第一個元素,第二個取自第二個數組的第一個元素,第三個取自第三個的第一個元素數組,第四個是第一個數組的第二個元素,依此類推,直到用盡。
如果我知道 arrays 的數量總是 3 我可以這樣做:
sets = list(h.keys())
t = sum( zip( h[sets[0], h[sets[1]], h[sets[2]] ), () )
這產生(10, 12, 8, 8, 10, 6, 6, 8, 4, 4, 6, 2, 2, 4, 0)
。
不知道我嘗試過的字典中有多少鍵:
t = sum( zip( [ h[k] for k in h.keys() ] ), () )
但這會產生:
([10, 8, 6, 4, 2], [12, 10, 8, 6, 4], [8, 6, 4, 2, 0])
關於如何使用可變長度字典獲得上述結果的任何想法?
您可以從zip(*h.values())
展平解壓的壓縮三元組:
>>> h = {'full':[10, 8, 6, 4, 2],'train':[12, 10, 8, 6, 4],'test':[8,6,4,2, 0]}
>>> tuple(zip(*h.values()))
((10, 12, 8), (8, 10, 6), (6, 8, 4), (4, 6, 2), (2, 4, 0))
>>> tuple(x for y in zip(*h.values()) for x in y)
(10, 12, 8, 8, 10, 6, 6, 8, 4, 4, 6, 2, 2, 4, 0)
對您的代碼進行一次小的修改就可以滿足您的需求:
t = sum( zip( *[ h[k] for k in h.keys() ] ), () )
*
用於解包 python 中的列表。
例如:
>>> x = [1, 2, 3]
>>> print(*x)
1 2 3
>>> print(x)
[1, 2, 3]
你可以先zip
你的字典的值。 zip
接受任意數量的可迭代對象,因此我們解壓縮h.values()
以提供它們。
然后,我們只需要鏈接壓縮值。
from itertools import chain
h = {'full': [11, 18, 16, 14, 12],
'train': [22, 20, 28, 26, 24],
'test': [38, 36, 34, 32, 30]}
out = tuple(chain.from_iterable(zip(*h.values())))
print(out)
# (11, 22, 38, 18, 20, 36, 16, 28, 34, 14, 26, 32, 12, 24, 30)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.