【问题标题】:How to intersect dictionaries? [duplicate]如何交叉字典? [复制]
【发布时间】:2018-06-23 02:04:37
【问题描述】:

我已经很久没有使用 python 并且有点生疏了,但是对于第一个问题,我正在使用字典并且需要将其相交以返回键和值。所以例如,我正在输入

a = {1:'a1', 2.5:'a2', 4:'a3'}
b = {1:'a1', 3:'a2',  5:'a4'}

如果我输入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 {}

【问题讨论】:

  • 对不起,我的意思是 {1:'a1'}(笔记本电脑正在自动更正),它在 a 和 b 中。
  • 那么{k: v for (k, v) in a.items() if k in b}?
  • 如果值不匹配怎么办?
  • 您的 intersect 代码测试 j 但从不分配任何东西。
  • 迭代每个字典的方式只迭代键,而不是值。要访问这些值,请使用 dict.items()dict.values()

标签: python dictionary set-intersection


【解决方案1】:

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

def intersect(a, b):
    return {k: a[k] for k in a.keys() & b.keys()}

这是可行的,因为dict.keys()(自 Python 3 起)返回的 dict_keys 视图对象是集合(即实现 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()}

除了返回其中一个值之外,我们还可以例如添加值:

>>> intersect({'a': 4, 'b': 3}, {'a': 5}, lambda a, b: a + b)
{'a': 9}

【讨论】:

  • 但这并不强制kab 中具有相同的值
  • OPs 问题中没有任何内容表明这是需要的。我还提供了一种自定义行为的方法。
【解决方案2】:

您可以使用 actual set 交叉点来简化此操作。这仅保留共享项(键和值相同):

def intersect(a, b):
    return dict(a.items() & b.items())

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

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

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

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

【讨论】:

  • 你能告诉我你为什么使用 items 和 dict 吗?在我的第一个代码中,我写了相同的东西,只是我没有包含这两个。
  • @coco_11 set(a) 等价于set(x for x in a),如果adict,这只会产生它的密钥。因此,items 调用。而且由于项目是一对列表,因此您必须再次调用dict
  • 在 Python 3 中,项目不作为列表给出。试试dict(a.items() & b.items())
  • @StefanPochmann 是的,但是我的答案中给出的解决方案在 Py 2 和 3 中都适用。而且这个问题没有用特定版本标记。
  • 是的,我只是说您的评论“项目是一对列表”
猜你喜欢
  • 2013-09-04
  • 2018-05-02
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2022-11-29
  • 2011-10-21
  • 2012-12-21
  • 2021-07-20
相关资源
最近更新 更多