Python创建数组的元组';来自可变长度数组字典的zip

Python创建数组的元组';来自可变长度数组字典的zip,python,tuples,Python,Tuples,标题可能过于复杂 我尝试做的是以下几点: 给定一个数组字典 h={'full':[10,8,6,4,2],'train':[12,10,8,6,4],'test':[8,6,4,2,0]} 我想得到数组中所有元素的元组,其中第一个元素取自第一个数组的第一个元素,第二个取自第二个数组的第一个元素,第三个取自第三个数组的第一个元素,第四个取自第一个数组的第二个元素,依此类推 如果我知道阵列的数量始终为3,我可以: sets = list(h.keys()) t = sum( zip( h[sets[

标题可能过于复杂

我尝试做的是以下几点:

给定一个数组字典

h={'full':[10,8,6,4,2],'train':[12,10,8,6,4],'test':[8,6,4,2,0]}

我想得到数组中所有元素的元组,其中第一个元素取自第一个数组的第一个元素,第二个取自第二个数组的第一个元素,第三个取自第三个数组的第一个元素,第四个取自第一个数组的第二个元素,依此类推

如果我知道阵列的数量始终为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])


关于如何使用可变长度字典获得上述结果,您有什么想法吗?

只需对代码稍作修改即可满足您的需要:

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
您的dict的值。
zip
接受任意数量的iterables,因此我们将
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)

您可以从
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)