如何从Python字典值中找到常用项?

时间:2016-02-02 18:58:42

标签: python set

说,我有一本字典D

D = {'A': {1, 2, 3}, 'B': {2, 4, 5}, 'C': {1, 2, 7}}

现在我希望得到D个值中的所有常用项,即2。 我尝试使用set.intersection,但没有成功。

4 个答案:

答案 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}

reduce()是Python 2.x中的内置函数,但需要从Python 3.x中的functools模块导入。

答案 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