展开python嵌套字典

时间:2018-04-17 19:21:23

标签: python dictionary nested networkx

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

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图。请帮忙

3 个答案:

答案 0 :(得分:0)

嵌套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

[OUT]

[[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]]

答案 1 :(得分:0)

这是使用itertools和comprehensions的一个解决方案。 (我承认它可能不是第一眼看到的最简单的。)

它还处理每个字典有多对。

如果您希望将该对作为输出中的元组,请移除*中的解压缩*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)]

答案 2 :(得分:-1)

def nthFrequent2(arr, n):
    for i, (value, _) in enumerate(itertools.groupby(sorted(arr))):
        if i == n - 1:
            return value

这应该可以解决你的问题