Python 基于值维的列表迭代词典理解

Python 基于值维的列表迭代词典理解,python,dictionary-comprehension,Python,Dictionary Comprehension,给定 是否有一种方法可以将上面的列表l映射到字典,以便键映射到字典t中的键,值映射到列对齐的修改列表l,与t中相同 以下for loop功能正常: 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
功能正常:

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])))

但是我想知道是否有一个与上述for循环相当的单行词典理解?

您的代码取决于键的顺序。尝试将t.keys()中k的
替换为
中k的('b','a')
,您将不会得到预期的结果。即使从Python3.7开始就保证了元素的顺序(参见注释),依赖它也不是一个好主意

可以使用元组:

t2={}
s=0
e=0
for k in t.keys():
    e=s+t.get(k).shape[1]
    t2[k]=l[:,s:e]
    s=e
要在dict理解中转换代码,可以计算列索引:

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))
然后生成阵列:

import itertools
indices = list(itertools.accumulate((v.shape[1] for _, v in t)))
# [3, 7]

我会说不,当在字典上迭代时,不确定顺序是否总是相同的,因此在这里的代码中,有关数组的串联顺序的信息丢失了。。。您可以使用,但我认为有一种更好的方法可以做到这一点,您可以提供更多关于您正在尝试做什么的详细信息吗?@xdze2这取决于您的python版本。到目前为止,DICT是按照其键的插入顺序进行正式排序的。在Cpython 3.6中已经是这样了,但它被认为是一个错误。
t2 = {k: l[:,s:s+v.shape[1]] for (k, v), s in zip(t, [0]+indices)}