簡體   English   中英

Python 從 arrays 的可變長度字典創建數組的元組 zip

[英]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.

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