【问题标题】:dictionary comprehension with list iteration based on value dimensions基于值维度的列表迭代字典理解
【发布时间】:2018-08-28 22:34:45
【问题描述】:

给定

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 在列上对齐,与 @ 相同987654328@?

以下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 循环等效的单行字典理解?

【问题讨论】:

  • 我会说不,当迭代字典时,不确定顺序是否始终相同,因此在此处的代码中,有关数组连接顺序的信息丢失了。 . 您可以使用OrderedDict,但我认为有更好的方法可以做到这一点,您能否详细说明您正在尝试做什么?
  • @xdze2 这取决于你的 python 版本。从python 3.7 开始,dicts 正式按其键的插入顺序排序。在 Cpython 3.6 中已经如此,但它被认为是 implementation detail

标签: python dictionary-comprehension


【解决方案1】:

您的代码取决于键的顺序。尝试用for k in ('b', 'a') 替换for k in t.keys(),你不会得到预期的结果。即使从 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)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2017-06-17
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2016-08-01
    相关资源
    最近更新 更多