从默认di中获取值

2024-04-23 06:03:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个默认形状:

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}})})

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

^{pr2}$

其中,对于一组奇数值,我重复旧对中的最后一个值作为新对中的新值,例如{5, 8, 11}变成了{}。在


Tags: lambda列表mainfunctionconstruct数值形状set
3条回答

编辑:刚刚意识到我读错了您的输出;答案更新了。在

事实上它是defaultdict并不重要,您可以使用。。。嗯,values()。但是,请注意,dict和{}是无序的(至少在大多数版本的Python中是这样),因此如果您想获得这个顺序,您必须对不同的dict和set进行排序,您可能需要使用items()而不是{}来获得键/值对并按键对它们进行排序。您可以在嵌套列表理解中这样做,然后解压到这三个变量,或者直接使用嵌套列表。要从内部列表中获取成对的连续元素,可以使用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(或python3.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()]]

该输出:

^{pr2}$

既然我回答了你的前一个问题,我想你想要什么可以通过以下列表理解来实现:

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

但是请注意,如果您希望结果具有特定的顺序,那么使用前面提到的方法是无法实现的,因为字典和集合不是按顺序排列的(除了Python-3.7,字典是按插入顺序排列的)。在

相关问题 更多 >