Python3中的嵌套DICT来自其他2个DICT

时间:2015-04-06 04:34:22

标签: python dictionary

我有两个dict个对象:

d1={A:B,...}
d2={A:(C,D),...}

我想从他们两个创建第三个dict

d3={D:{C:{A:B}...}...}

这就是我的所作所为:

d3={}
for A in list(d1.keys()):
  d3.setdefault(A,{}).update(d3[A].setdefault(d1[A],{}).update({d2[A][0]:d2[A][1]}))

并且它完美地工作(根据d3中的结果数据),除了这个错误:

TypeError: 'NoneType' object is not iterable

我应该安全地忽视错误吗?我可以做到没有错误吗?

已编辑以提供样本数据:

d1={9024: 92, 3905: 10, 1922: 74, 2564: 14, 3527: 6, 5578: 9, 1863: 36, 3660: 35, 216: 27, 8334: 16, 8272: 72, 7249: 93, 9426: 45, 659: 35, 1327: 84, 6357: 1, 2519: 7, 6872: 40, 6489: 86, 3503: 59, 5710: 90, 4319: 98, 6112: 43, 6947: 61, 741: 2, 9510: 86, 8807: 19, 4457: 38, 2086: 83, 807: 46, 8559: 97, 9457: 55, 937: 98, 4411: 10, 7483: 4, 3018: 29, 8277: 45}
d2={9024: ('127', '1'), 3905: ('125', '1'), 1922: ('124', '1'), 2564: ('125', '1'), 7483: ('126', '1'), 3527: ('125', '1'), 5710: ('126', '1'), 5578: ('126', '1'), 3660: ('125', '1'), 8334: ('127', '1'), 8272: ('127', '1'), 7249: ('126', '1'), 9426: ('127', '1'), 659: ('124', '1'), 6357: ('126', '1'), 2519: ('125', '1'), 6872: ('126', '1'), 6489: ('126', '1'), 3503: ('125', '1'), 216: ('124', '1'), 4319: ('125', '1'), 6112: ('126', '1'), 9457: ('127', '1'), 6947: ('126', '1'), 741: ('124', '1'), 9510: ('127', '1'), 8807: ('127', '1'), 8559: ('127', '1'), 4457: ('125', '1'), 1863: ('124', '1'), 1327: ('124', '1'), 807: ('124', '1'), 937: ('124', '1'), 4411: ('125', '1'), 2086: ('124', '1'), 3018: ('125', '1'), 8277: ('127', '1')}

d3={'1': {'127': {9024: 92, 8272: 72, 9426: 45, 8277: 45, 9510: 86, 8807: 19, 9457: 55, 8334: 16, 8559: 97}, '126': {6112: 43, 7249: 93, 6947: 61, 6357: 1, 6872: 40, 6489: 86, 5578: 9, 7483: 4, 5710: 90}, '125': {3905: 10, 4411: 10, 2564: 14, 2519: 7, 4457: 38, 3018: 29, 3527: 6, 3660: 35, 4319: 98, 3503: 59}, '124': {1922: 74, 659: 35, 741: 2, 2086: 83, 1863: 36, 216: 27, 937: 98, 807: 46, 1327: 84}}}

1 个答案:

答案 0 :(得分:1)

您的代码的逻辑有点难以理解,但这是一个简化的形式,可以提供预期的输出:

>>> d1={9024: 92, 3905: 10, 1922: 74, 2564: 14, 3527: 6, 5578: 9, 1863: 36, 3660: 35, 216: 27, 8334: 16, 8272: 72, 7249: 93, 9426: 45, 659: 35, 1327: 84, 6357: 1, 2519: 7, 6872: 40, 6489: 86, 3503: 59, 5710: 90, 4319: 98, 6112: 43, 6947: 61, 741: 2, 9510: 86, 8807: 19, 4457: 38, 2086: 83, 807: 46, 8559: 97, 9457: 55, 937: 98, 4411: 10, 7483: 4, 3018: 29, 8277: 45}
>>> d2={9024: ('127', '1'), 3905: ('125', '1'), 1922: ('124', '1'), 2564: ('125', '1'), 7483: ('126', '1'), 3527: ('125', '1'), 5710: ('126', '1'), 5578: ('126', '1'), 3660: ('125', '1'), 8334: ('127', '1'), 8272: ('127', '1'), 7249: ('126', '1'), 9426: ('127', '1'), 659: ('124', '1'), 6357: ('126', '1'), 2519: ('125', '1'), 6872: ('126', '1'), 6489: ('126', '1'), 3503: ('125', '1'), 216: ('124', '1'), 4319: ('125', '1'), 6112: ('126', '1'), 9457: ('127', '1'), 6947: ('126', '1'), 741: ('124', '1'), 9510: ('127', '1'), 8807: ('127', '1'), 8559: ('127', '1'), 4457: ('125', '1'), 1863: ('124', '1'), 1327: ('124', '1'), 807: ('124', '1'), 937: ('124', '1'), 4411: ('125', '1'), 2086: ('124', '1'), 3018: ('125', '1'), 8277: ('127', '1')}
>>> d3 = {}
>>> for A in d1:
...    d3.setdefault(d2[A][1], {}).setdefault(d2[A][0], {}).update({A:d1[A]})
>>> d3
{'1': {'124': {216: 27,
   659: 35,
   741: 2,
   807: 46,
   937: 98,
   1327: 84,
   1863: 36,
   1922: 74,
   2086: 83},
   ...