我有一个默认的形状:
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}
。
答案 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()
来获取值。但是请注意,dict
和set
是无序的(至少在大多数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
。