从默认字典中获取值

时间:2018-08-01 08:51:12

标签: python python-3.x dictionary defaultdict

我有一个默认的形状:

 plane.firstMaterial?.diffuse.contents = UIImage(named: "ColourCrocefissione")

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

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}

3 个答案:

答案 0 :(得分:2)

您可以使用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]]

答案 1 :(得分:1)

自从我回答了上一个问题以来,我认为可以通过以下列表理解来实现您想要的:

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

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

答案 2 :(得分:1)

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

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