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