Python:将字典项除以取决于第一个键的值

时间:2018-07-31 14:39:52

标签: python dictionary

我相信这个问题与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)

4 个答案:

答案 0 :(得分:4)

{ "name": "test", "version": "0.1.0", "private": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.0-14", "@fortawesome/free-solid-svg-icons": "^5.1.0-11", "@fortawesome/react-fontawesome": "0.1.0-11", "mongodb": "^3.1.1", "mongoose": "^5.2.5", "react": "^15.6.1", "react-bootstrap": "^0.31.3", "react-dom": "^15.6.1", "react-google-auth": "^0.4.1", "react-router-dom": "^4.2.2", "react-scripts": "1.0.13" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } } i用另外的括号引起来,因为j返回的形式为y.items()

一些需要说明的事情:

  1. 除以0
  2. 如何处理<(k1, k2), v>中缺少的条目

x

您可以选择处理0除法,也可以抛出异常。此外,如果{(i, j) : v / max(x.get(i, 1), 1) for (i, j), v in y.items()} 中缺少i,则应考虑如何处理。我假设什么也没做(即除以1)。

答案 1 :(得分:1)

您可以尝试:

{k: v / (x[k[0]] or 1) for k,v in y.items()}

其中x[k[0]] or 1修复了ZeroDivisionError

答案 2 :(得分:1)

该错误是由于部分splits <- split(seq(nrow(mat)), mat[, 1]) splits <- lapply(splits, function(x) mat[c(x, rep(NA, max(lengths(splits)) - length(x))),]) library(abind) do.call(abind, list(splits, along = 3)) # , , a # # [,1] [,2] [,3] # [1,] "a" "5" "7" # [2,] "a" "33" "45" # # , , b # # [,1] [,2] [,3] # [1,] "b" "23" "63" # [2,] NA NA NA # # , , c # # [,1] [,2] [,3] # [1,] "c" "34" "56" # [2,] "c" "444" "32" 引起的。 i,j,v in y.items()返回一种类型为y.items()的2种项目类型的可枚举集合。
由于这里是您自己的元组,因此可以通过将(<key>,<value>)括在方括号中来进一步解压缩它:i,j,这将解压缩密钥对,然后解压缩复合密钥。

总体而言,这给出了:(i,j),v in y.items()

您还可能遇到键不能为列表的问题,因为列表不能为哈希,因此您将不得不用y = {[i,j]: v / (x[i]) for (i,j),v in y.items()}代替[i,j]

答案 3 :(得分:0)

您可以尝试这样的事情

y = {k: v / (x[k[0]]) for k,v in y.items() if x[k[0]]}