如何从Python字典值中查找公共项?
喂,我有一本字典如何从Python字典值中查找公共项?,python,set,Python,Set,喂,我有一本字典D: D = {'A': {1, 2, 3}, 'B': {2, 4, 5}, 'C': {1, 2, 7}} 现在我想得到D的值中的所有公共项,即2。 我试图使用set.intersection,但没有成功。简单地说,使用set的方法: >>> set.intersection(*D.values()) {2} D.values()将返回已设置的词典值列表,然后*D.values()将解压此列表并将其传递给集合的方法类如果您只在每个字典中查找公共值,而不在
D
:
D = {'A': {1, 2, 3}, 'B': {2, 4, 5}, 'C': {1, 2, 7}}
现在我想得到D
的值中的所有公共项,即2。
我试图使用set.intersection
,但没有成功。简单地说,使用set
的方法:
>>> set.intersection(*D.values())
{2}
D.values()
将返回已设置的词典值列表,然后*D.values()
将解压此列表并将其传递给集合的方法类如果您只在每个字典中查找公共值,而不在每个字典中查找值,则以下代码将起作用!不是说这是最快或最好的方法,但它是有效的!
返回嵌入DICT中所有重复值的列表
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
为了多样性,您还可以使用reduce()
:
是Python 2.x中的内置函数,但需要从Python 3.x中的模块导入。如果使用reduce
最有效的方法是使用运算符。和
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.cross
将很难击败:
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
reduce
在Python3+中可用吗?@IronFist:在Python3.x中,您需要在functools import reduce中说。
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