我有以下字典。
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}
有一种优雅的方法来进行此计算并创建一个新词典吗?
答案 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())) }