给予
import numpy as np
t={'a':np.random.randint(0,9,[2,3]),'b':np.random.randint(0,9,[2,4])}
l=np.hstack([t.get(k) for k in t.keys()])
l=np.vstack((l, np.random.randint(0,9,[1,7])))
有没有一种方法可以将上面的列表l
映射到字典,这样键就映射到字典t
中的键,而值映射到对齐的字典l
列,与t
中的列相同?
以下for loop
可以工作:
t2={}
s=0
e=0
for k in t.keys():
e=s+t.get(k).shape[1]
t2[k]=l[:,s:e]
s=e
但是我想知道是否有一个相当于上面for循环的班轮字典理解?
答案 0 :(得分:0)
您的代码取决于按键的顺序。尝试将for k in t.keys()
替换为for k in ('b', 'a')
,将不会获得预期的结果。即使自python 3.7起就保证了元素的顺序(请参阅注释),也可能依赖它不是一个好主意。
您可以使用元组:
import numpy as np
a = np.random.randint(0,9,[2,3])
b = np.random.randint(0,9,[2,4])
t = [('a', a), ('b', b)]
l = np.hstack([v for _, v in t])
c = np.random.randint(0,9,[1,7])
l = np.vstack((l, c))
要在dict理解中转换代码,可以计算列索引:
import itertools
indices = list(itertools.accumulate((v.shape[1] for _, v in t)))
# [3, 7]
然后生成数组:
t2 = {k: l[:,s:s+v.shape[1]] for (k, v), s in zip(t, [0]+indices)}