从默认字典中获取值
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()
。但是请注意,dict
和 set
是无序的(至少在 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]]
我有一个 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()
。但是请注意,dict
和 set
是无序的(至少在 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]]