说,我有一本字典D
:
D = {'A': {1, 2, 3}, 'B': {2, 4, 5}, 'C': {1, 2, 7}}
现在我希望得到D
个值中的所有常用项,即2。
我尝试使用set.intersection
,但没有成功。
答案 0 :(得分:5)
只需使用set
的{{3}}方法:
>>> set.intersection(*D.values())
{2}
D.values()
将返回已设置的字典值列表,然后*D.values()
会解压缩此列表并将其传递给intersection
类的set
方法
答案 1 :(得分:3)
为了多样化,您还可以使用reduce()
:
>>> D = {'A': {1, 2, 3}, 'B': {2 ,4, 5}, 'C': {1, 2, 7}}
>>> reduce(lambda x, y: x & y, D.values()) # or use operator.and_ instead of lambda
{2}
答案 2 :(得分:0)
如果您只是在每个字典中查找常用值而不是查找每个字典中的值,则以下代码将起作用!不是说这是最快或最好的方法,但它有效! 返回嵌入式dicts中所有重复值的列表!
def findCommon(data):
flipped = {}
out = []
for i in data:
for value in data[i]:
if value not in flipped:
flipped[value] = [i]
else:
flipped[value].append(i)
for i in flipped:
if len(flipped[i]) > 1:
out.append(i)
return out
答案 3 :(得分:0)
如果您选择reduce
,最有效的方法是使用operator.and_
from functools import reduce
from operator import and_
D = {'A': {1, 2, 3}, 'B': {2, 4, 5}, 'C': {1, 2, 7}}
print(reduce(and_, D.values()))
但是set.intersection
很难被击败:
In [89]: from functools import reduce
In [90]: from operator import and_
In [91]: timeit reduce(lambda x, y: x & y, D.values())
1000 loops, best of 3: 221 µs per loop
In [92]: timeit reduce(and_,D. values())
10000 loops, best of 3: 170 µs per loop
In [93]: timeit set.intersection(*D.values())
10000 loops, best of 3: 155 µs per loop