在对值进行一些计算后,从现有字典创建新字典

时间:2018-06-14 12:19:29

标签: python dictionary

我有以下字典。

myD = {0: [1,2,3,4], 2: [2,3,4,5], 3: [3,4,5,6]}

我需要通过使用以下列表中的数字除以值(列表)来创建新词典(或更新当前词典)

deviders = [2,4,8]

预期输出(伪) - >

newD = {0: [1,2,3,4]/2, 2: [2,3,4,5]/4, 3: [3,4,5,6]/8}

有一种优雅的方法来进行此计算并创建一个新词典吗?

5 个答案:

答案 0 :(得分:4)

鉴于您的密钥之间的间隔错开,您可以使用以下内容:

from __future__ import division

d = {0: [1,2,3,4], 2: [2,3,4,5], 3: [3,4,5,6]}
dividers = [2,4,8]

new = dict((k, [i / j for i in d[k]]) for k, j in zip(sorted(d), dividers))

# {0: [0.5, 1.0, 1.5, 2.0],
#  2: [0.5, 0.75, 1.0, 1.25],
#  3: [0.375, 0.5, 0.625, 0.75]}

在Python< 3.7,对字典的键进行排序可能是个好主意,因为它们的顺序不能保证与dividers对齐。这导致需要使用d[k]代替.items() / .iteritems()来迭代字典。

答案 1 :(得分:2)

您可以使用词典理解。首先将键映射到除法因子。然后通过列表推导划分列表中的每个元素。

div_map = {0: 2, 2: 4, 3: 8}
# or div_map = dict(zip(sorted(myD), (2, 4, 8)))

newD = {k: [i / div_map[k] for i in v] for k, v in myD.items()}

您尝试的语法类似于第三方库NumPy:

import numpy as np

newD = {k: np.array(v) / div_map[k] for k, v in myD.items()}

答案 2 :(得分:0)

这是我对你的问题的看法,希望它有所帮助;

def div(d, my_dict):
  count = 0
  for k, v in my_dict.items():
    my_dict[k] = [num/d[count] for num in v]
    count +=1
  return my_dict

myD = {0: [1,2,3,4], 2: [2,3,4,5], 3: [3,4,5,6]}
dividers = [2,4,8]
print(div(dividers, myD))

答案 3 :(得分:0)

我建议你没有任何导入并保持密钥的顺序:

myD = {0: [1,2,3,4], 2: [2,3,4,5], 3: [3,4,5,6]}     
dividers = [2,4,8]

result = {k: [v / dividers[ki]  for v in myD[k]] for ki,k in enumerate(sorted(myD.keys()))}

print(result)
# {0: [0.5, 1.0, 1.5, 2.0], 2: [0.5, 0.75, 1.0, 1.25], 3: [0.375, 0.5, 0.625, 0.75]}

答案 4 :(得分:0)

假设myD不长于deviders,您只需一行:

{ k: [ j / deviders[i] for j in myD[k] ] for i, k in enumerate(sorted(myD.keys())) }