从默认字典中获取值

Getting values out of a default dict

我有一个 defaultdict 的形状:

defaultdict(<function __main__.construct_dicts.<locals>.<lambda>>,
            {1: defaultdict(set, {'A': {0, 1}}),
             2: defaultdict(set, {'A': {1, 3}, 'E': {12, 14}}),
             3: defaultdict(set,
                         {'A': {3, 6},
                          'C': {4, 7, 10},
                          'D': {5, 8, 11},
                          'E': {9, 12}})})

如何将所有值放入三个列表中,例如:

lst_1 = [[0, 1]]
lst_2 = [[1, 3], [12, 14]]
lst_3 = [[3, 6], [4, 7], [7, 10], [5, 8], [8, 11], [9, 12]]

其中,对于一组奇数值,我将旧对中的最后一个值重复为新对中的新值,例如 {5, 8, 11} 变为 [5, 8], [8, 11]

由于我回答了你之前的问题,我认为你想要的可以使用如下列表理解来实现:

[list(i.values()) for i in nested_dict.values()]

但请注意,如果您希望结果具有特定的顺序,则无法使用上述方法实现,因为字典和集合没有排序(除了自 Python-3.7 以来字典是插入顺序的) .

编辑: 刚刚意识到我误读了你的输出;答案已更新。

它是 defaultdict 的事实并不重要,您可以使用...获取值,好吧,values()。但是请注意,dictset 是无序的(至少在 Python 的大多数版本中是这样),因此如果您想获得该顺序,则必须对不同的字典和集合进行排序,您可能想使用 items() 而不是 values() 来获取 key/value 对并按键对它们进行排序。您可以在嵌套列表理解中执行此操作,然后解压缩到这三个变量,或者直接使用嵌套列表。要从内部列表中获取成对的连续元素,您可以使用 zip(lst, lst[1:]) 方法。

d = { 1: {'A': {0, 1}},
      2: {'A': {1, 3}, 'E': {12, 14}},
      3: {'A': {3, 6}, 'C': {4, 7, 10}, 'D': {5, 8, 11}, 'E': {9, 12}}}

def pairs(values):
    return zip(values, values[1:])
l1, l2, l3 = [[p for _, vs in sorted(inner.items())
                 for p in pairs(sorted(vs))]
              for _, inner in sorted(d.items())]
print(lst1, lst2, lst3, sep="\n")
# [(0, 1)]
# [(1, 3), (12, 14)]
# [(3, 6), (4, 7), (7, 10), (5, 8), (8, 11), (9, 12)]

请注意,这将按项目的值(数字或字典顺序)而不是插入顺序对项目进行排序。对于后者,您可以使用 OrderedDict(或 Python 3.7+),然后不用 sorted.

您可以使用 itertools.zip_longest 生成所需的值对,然后使用 enumerate 对结果列表进行索引,以便您可以使用奇数项填充集合中的缺失值来自最后一个索引对:

from itertools import chain, zip_longest
d = {
    1: {'A': {0, 1}},
    2: {'A': {1, 3}, 'E': {12, 14}},
    3: {'A': {3, 6}, 'C': {4, 7, 10}, 'D': {5, 8, 11}, 'E': {9, 12}}
}
lst1, lst2, lst3 = [[[i[n - 1][1], j[0]] if j[1] is None else list(j) for n, j in enumerate(i)] for i in [list(chain.from_iterable([list(zip_longest(l[::2], l[1::2])) for l in map(sorted, v.values())])) for v in d.values()]]

这输出:

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