我相信这个问题非常类似于Divide each python dictionary by total value,但是我不能处理多维键。你知道吗
所以我有了第一本字典:
x={'SBGL': 0.2631678018921199, 'SBAR': 0.00017329658914466182, 'SBKP': 0.05787906885949929, 'SBRJ': 0.01686853063415596, 'SBFZ': 0.002151268003175112, 'SBCH': 0.0, 'SBRF': 0.0010995369794006128, 'SBFI': 0.0, 'SBGR': 0.3555667545433087, 'SBCT': 0.12645173241811486, 'SBFL': 0.0020536641771051302, 'SBSP': 0.12206752790423671, 'SBSV': 0.002883296698699977, 'SBMG': 0.0, 'SBCA': 0.0, 'SBPA': 0.024485612897250063, 'SBPS': 0.0006125138064595806, 'SBCF': 0.005023609170377438, 'SBMO': 0.0020686035382382908, 'SBBR': 0.01744718188871371, 'SBJV': 0.0}
我有第二本字典:
y= {('SBCF', 'TAM'): 294.0, ('SBCH', 'GLO'): 0.0, ('SBSP', 'ONE'): 0.0, ('SBGL', 'TAM'): 114094.0, ('SBCA', 'PTB'): 0.0, ('SBKP', 'GLO'): 0.0, ('SBMG', 'AZU'): 0.0, ('SBRF', 'GLO'): 1104.0, ('SBPA', 'AZU'): 23367.0, ('SBGR', 'AZU'): 313.0, ('SBGR', 'GLO'): 105170.0, ('SBCT', 'ONE'): 0.0, ('SBKP', 'TAM'): 160.0, ('SBGL', 'ONE'): 25330.0, ('SBGR', 'ONE'): 69043.0, ('SBCT', 'PTB'): 0.0, ('SBRJ', 'TAM'): 8118.0, ('SBPS', 'GLO'): 615.0, ('SBPA', 'TAM'): 1218.0, ('SBSV', 'GLO'): 1691.0, ('SBFI', 'AZU'): 0.0, ('SBSP', 'TAM'): 62158.0, ('SBKP', 'ONE'): 0.0, ('SBGR', 'PTB'): 0.0, ('SBGR', 'TAM'): 182484.0, ('SBCT', 'AZU'): 85180.0, ('SBBR', 'TAM'): 12685.0, ('SBBR', 'GLO'): 4833.0, ('SBGL', 'GLO'): 124812.0, ('SBJV', 'GLO'): 0.0, ('SBCT', 'TAM'): 11374.0, ('SBCT', 'GLO'): 30411.0, ('SBMO', 'GLO'): 1822.0, ('SBCF', 'AZU'): 4750.0, ('SBPA', 'GLO'): 0.0, ('SBCF', 'GLO'): 0.0, ('SBMO', 'TAM'): 255.0, ('SBFL', 'AZU'): 2062.0, ('SBFL', 'GLO'): 0.0, ('SBCA', 'AZU'): 0.0, ('SBRJ', 'GLO'): 7426.0, ('SBFI', 'ONE'): 0.0, ('SBKP', 'AZU'): 57954.0, ('SBFZ', 'TAM'): 97.0, ('SBSP', 'GLO'): 60405.0, ('SBRJ', 'AZU'): 1393.0, ('SBFZ', 'GLO'): 2063.0, ('SBSV', 'TAM'): 1204.0, ('SBAR', 'TAM'): 174.0, ('SBFI', 'GLO'): 0.0}
我想将y的所有项除以一个值,该值取决于第一个键并且来自x。更准确地说,第一个键等于'SBCF'的y的所有项都将除以x['SBCF']。y中第一个键等于且第一个键等于'SBCH'的所有项都应除以x['SBCH'],依此类推。。。你知道吗
我试过这样的方法:
y = {[i,j]: v / (x[i]) for i,j,v in y.items()}
我有个错误
not enough values to unpack (expected 3, got 2)
在
i
和j
之间加上一组括号,因为y.items()
返回<(k1, k2), v>
形式的内容。你知道吗有些事情需要说明:
x
中缺少的条目您可以选择处理除法0,也可以让异常被抛出。另外,如果
i
在x
中丢失,您应该考虑如何处理它。我假设什么也没做(即除以1)。你知道吗您可以尝试:
其中
x[k[0]] or 1
修复ZeroDivisionError
错误是由于部件
i,j,v in y.items()
引起的。y.items()
返回(<key>,<value>)
形式的2个项类型的可枚举集合。因为这里的元组本身就是一个元组,所以可以通过将
i,j
包装在括号中来进一步解包:(i,j),v in y.items()
这将解包密钥项对,然后解包复合密钥。你知道吗总的来说,这是:
y = {[i,j]: v / (x[i]) for (i,j),v in y.items()}
您还可能会遇到这样一个问题:键不能是列表,因为列表不能是散列,所以您必须用
[i,j]
替换(i,j)
。你知道吗相关问题 更多 >
编程相关推荐