如何交叉字典?

1 python dictionary set-intersection

我已经很长时间没有学习Python了,而且有点生疏,但对于第一个问题,我正在使用一本字典,需要将它相交以返回键和值。例如,我要输入

a = {1:'a1', 2.5:'a2', 4:'a3'}
b = {1:'a1', 3:'a2',  5:'a4'}
Run Code Online (Sandbox Code Playgroud)

如果我进入c = intersect(a,b),我希望它返回{1:'a1'},但我只能返回{'a1'}

到目前为止我的代码是:

def intersect(a, b):
    for i in a:
        if j in b:
            if a[i]==b[i]:
                return ({i})
        else:
            return {}
Run Code Online (Sandbox Code Playgroud)

sch*_*ggl 6

您可以使用实际的 set交集来简化它。这仅保留共享项目(键和值相同):

def intersect(a, b):
    return dict(a.items() & b.items())
Run Code Online (Sandbox Code Playgroud)

如果您的dict参数具有不可散列的值,您可以dict按照以下方式进行理解:

def intersect(a, b):
    return {k: a[k] for k in a if b.get(k, not a[k]) == a[k]}
Run Code Online (Sandbox Code Playgroud)

您可以像这样修复原来的方法:

def intersect(a, b):
    d = {}
    for i in a:
        if i in b and a[i] == b[i]:
            d[i] = a[i]
    return d
Run Code Online (Sandbox Code Playgroud)

  • 在 Python 3 中,项目不是以列表形式给出的。尝试`dict(a.items() & b.items())`。 (2认同)

Seb*_*der 5

这是该函数的一个版本intersect,它与键相交并使用第一个字典的值,这意味着在不同值的情况下,该函数会偏向第一个字典中的值:

def intersect(a, b):
    return {k: a[k] for k in a.keys() & b.keys()}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为(自 Python 3 起)dict_keys返回的视图对象dict.keys()是集合(即 Implement collections.abc.Set)。

如果您想自定义将使用哪个值,我们可以使用一个函数,该函数接受两个值:

def intersect(a, b, select=lambda a, b: a):
    return {k: select(a[k], b[k]) for k in a.keys() & b.keys()}
Run Code Online (Sandbox Code Playgroud)

我们也可以添加这些值,而不是返回其中一个值:

>>> intersect({'a': 4, 'b': 3}, {'a': 5}, lambda a, b: a + b)
{'a': 9}
Run Code Online (Sandbox Code Playgroud)