如何获得字典键组合的唯一值集?
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}]
我正在使用 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}]