【问题标题】:Unwrap python nested dictionary展开 python 嵌套字典
【发布时间】:2018-04-17 19:21:23
【问题描述】:

我有一个这个序列的嵌套字典:

data_dict = {0: [{1: 2}, {2: 3}, {3: 6}, {7: 8}], 1: [{0: 2}, {4: 7}, {2: 5}], 2: [{0: 3}, {1: 5}, {5: 4}, {11: 5}], 
3: [{0: 6}, {6: 2}, {11: 4}], 4: [{1: 7}], 5: [{2: 4}, {8: 3}], 6: [{3: 2}, {9: 3}], 7: [{0: 8}], 8: [{5: 3}], 9: [{6: 3}, {10: 6}], 
10: [{9: 6}], 11: [{2: 5}, {3: 4}]}

我想把字典解包成一个列表:

0   1  2
0   2  3
0   3  6
0   7  8
1   4  7
1   2  5
2   5  4
2  11  5
3   6  2
3  11  4
5   8  3
6   9  3
9  10  6

确切地说,我想从嵌套字典中创建一个networkX 图。请帮忙。

【问题讨论】:

  • 问题不清楚,尤其是最后一部分。什么是“我的算法”? adj_list 是从哪里来的?为什么它与graph 形状相同,但包含不同的数据?什么是内部字典值,它们是边缘权重吗?
  • 另外,将一对值表示为单元素字典也没有意义。使用包含 2 个元素的元组。
  • 在你的最终列表中,哪些是你的节点?

标签: python dictionary nested networkx


【解决方案1】:

嵌套dict

{0: [{1: 2}, {2: 3}, {3: 6}, {7: 8}],
 1: [{0: 2}, {4: 7}, {2: 5}],
 2: [{0: 3}, {1: 5}, {5: 4}, {11: 5}],
 3: [{0: 6}, {6: 2}, {11: 4}],
 4: [{1: 7}],
 5: [{2: 4}, {8: 3}],
 6: [{3: 2}, {9: 3}],
 7: [{0: 8}],
 8: [{5: 3}],
 9: [{6: 3}, {10: 6}],
 10: [{9: 6}],
 11: [{2: 5}, {3: 4}]}

解开

results = []
for v,list_dicts in data_dict.items():
    for d in list_dicts:
        results.append([v,list(d.keys())[0],list(d.values())[0]])
results

[出]

[[0, 1, 2],
 [0, 2, 3],
 [0, 3, 6],
 [0, 7, 8],
 [1, 0, 2],
 [1, 4, 7],
 [1, 2, 5],
 [2, 0, 3],
 [2, 1, 5],
 [2, 5, 4],
 [2, 11, 5],
 [3, 0, 6],
 [3, 6, 2],
 [3, 11, 4],
 [4, 1, 7],
 [5, 2, 4],
 [5, 8, 3],
 [6, 3, 2],
 [6, 9, 3],
 [7, 0, 8],
 [8, 5, 3],
 [9, 6, 3],
 [9, 10, 6],
 [10, 9, 6],
 [11, 2, 5],
 [11, 3, 4]]

【讨论】:

    【解决方案2】:

    这是使用 itertools 和理解的一种解决方案。 (虽然我承认它可能不是最容易一见钟情的。)

    它还可以处理每个字典的一对以上。

    如果您希望将这对作为输出中的元组,请删除 *pair 中的解包 *

    from itertools import chain
    from pprint import pprint
    
    data_dict = {
        0: [{1: 2}, {2: 3}, {3: 6}, {7: 8}],
        1: [{0: 2}, {4: 7}, {2: 5}],
        2: [{0: 3}, {1: 5}, {5: 4}, {11: 5}],
        3: [{0: 6}, {6: 2}, {11: 4}],
        4: [{1: 7}],
        5: [{2: 4}, {8: 3}],
        6: [{3: 2}, {9: 3}],
        7: [{0: 8}],
        8: [{5: 3}],
        9: [{6: 3}, {10: 6}],
        10: [{9: 6}],
        11: [{2: 5}, {3: 4}],
    }
    
    data_list = list(chain(*(
        [(key, *pair) for pair in chain(*(d.items() for d in dicts))]
        for (key, dicts)
        in data_dict.items()
    )))
    
    pprint(data_list)
    

    输出:

    [(0, 1, 2),
     (0, 2, 3),
     (0, 3, 6),
     (0, 7, 8),
     (1, 0, 2),
     (1, 4, 7),
     (1, 2, 5),
     (2, 0, 3),
     (2, 1, 5),
     (2, 5, 4),
     (2, 11, 5),
     (3, 0, 6),
     (3, 6, 2),
     (3, 11, 4),
     (4, 1, 7),
     (5, 2, 4),
     (5, 8, 3),
     (6, 3, 2),
     (6, 9, 3),
     (7, 0, 8),
     (8, 5, 3),
     (9, 6, 3),
     (9, 10, 6),
     (10, 9, 6),
     (11, 2, 5),
     (11, 3, 4)]
    

    【讨论】:

      【解决方案3】:
          ls = []
      rows = 0
      for key in data_dict:
          for tempValue in data_dict[key]:
              # print(tempValue)
              ls.append([])
              for (k, v) in tempValue.items():
                  ls[rows].append(key)
                  ls[rows].append(k)
                  ls[rows].append(v)
              rows+=1
      print(ls)
      

      这应该可以解决您的问题

      【讨论】:

        猜你喜欢
        • 2021-04-18
        • 2018-10-30
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-17
        • 2018-05-31
        相关资源
        最近更新 更多