如何获得字典键组合的唯一值集?

How do I get the unique set of values for a combination of dictionary keys?

我正在使用 Python 3.7。我有一个字典列表,例如

my_dict = [{"a": 1, "b": 5, "c": 6}, {"a": 1, "b": 5, "c": 2}, {"a": 2, "b": 1, "c": 6}]

如果我想获取单个键的唯一值集,例如"a",我可以

set(d['a'] for d in my_dict)

但是我如何获得键组合的唯一值集,比如 "a" 和 "b"?在上面的例子中,答案是

[[1, 2], [1, 5]]

同理;您也只需要遍历键即可。

[set(d[k] for d in my_dict) for k in ["a", "b"]]

我不完全确定这些要求(有什么独特之处?),但根据我的解释,以下作品:

> {tuple(d[i] for i in ["a", "b"]) for d in my_dict}
{(1, 5), (2, 1)}

它还执行以下操作:

> my_dict2 = [{"a": 1, "b": 5, "c": 6}, {"a": 5, "b": 1, "c": 2}, {"a": 2, "b": 1, "c": 6}]

> {tuple(d[i] for i in ["a", "b"]) for d in my_dict2}
{(1, 5), (2, 1), (5, 1)}

相对于

> [set(d[k] for d in my_dict2) for k in ["a", "b"]]
[{1, 2, 5}, {1, 5}]

OP 要求提供一些未完全指定的内容,但通过示例进行了说明。 到目前为止,已经发布了两个答案。 None 其中与请求的示例匹配,因此我提供了一个替代方案,它确实与 OP 中的示例匹配。

对于使用的两种情况

my_dict = [{"a": 1, "b": 5, "c": 6}, {"a": 1, "b": 5, "c": 2}, {"a": 2, "b": 1, "c": 6}]   # In the OP
my_dict2 = [{"a": 1, "b": 5, "c": 6}, {"a": 5, "b": 1, "c": 2}, {"a": 2, "b": 1, "c": 6}]   # In one of the answers

之前提供的2个选项,加上当前的一个,给出

print([set(d[k] for d in my_dict) for k in ["a", "b"]])         # Answer #1
print({tuple(d[i] for i in ["a", "b"]) for d in my_dict})       # Answer #2
print([list(set(d[k] for d in my_dict)) for k in ["a", "b"]])   # Current Answer

print([set(d[k] for d in my_dict2) for k in ["a", "b"]])        # Answer #1
print({tuple(d[i] for i in ["a", "b"]) for d in my_dict2})      # Answer #2
print([list(set(d[k] for d in my_dict2)) for k in ["a", "b"]])  # Current Answer

[{1, 2}, {1, 5}]
{(1, 5), (2, 1)}
[[1, 2], [1, 5]]           <--- As requested
[{1, 2, 5}, {1, 5}]
{(1, 5), (5, 1), (2, 1)}
[[1, 2, 5], [1, 5]]

您可以使用运算符 itemgetter 从字典中获取多个值:

from operator import itemgetter

zipped = zip(*map(itemgetter('a', 'b'), my_dict))
list(map(set, zipped))
# [{1, 2}, {1, 5}]