繁体   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