加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 从字典列表中创建一个非矛盾项的字典

发布时间:2020-12-20 12:19:56 所属栏目:Python 来源:网络整理
导读:这个问题的灵感来自 this question.我想从字典列表中获取一个字典,该字典应该包含所有字典中的所有键/值对,这些字典只包含一次,或者所有字典都对相关值达成一致.示例(摘自上述帖子): dicts = [dict(a=3,b=89,d=2),dict(a=3,c=99),b=42,c=33)]print dict_ite
这个问题的灵感来自 this question.我想从字典列表中获取一个字典,该字典应该包含所有字典中的所有键/值对,这些字典只包含一次,或者所有字典都对相关值达成一致.示例(摘自上述帖子):

dicts = [dict(a=3,b=89,d=2),dict(a=3,c=99),b=42,c=33)]
print dict_itersection(dicts)

应该屈服

{'a': 3,'d': 2}

我目前的实现如下:

import collections

def dict_intersection(dicts):
        c=collections.defaultdict(set)
        for d in dicts:
                for a,b in d.iteritems():
                        c[a].add(b)
        return {a: next(iter(b)) for a,b in c.iteritems() if len(b) == 1}

所以我的问题是:这可以更优雅地完成吗?

Sidequestion:可以在不修改基础字典(即不是b.pop())的情况下更好地完成(iter(b))吗?

解决方法

到目前为止,所有解决方案都假设所有字典值都是可清如果没有这个假设,代码不会变慢,只会变得更复杂,我会放弃它.这是一个适用于所有支持的值的版本!=:

def dict_intersection(dicts):
    result = {}
    conflicting = set()
    for d in dicts:
        for k,v in d.iteritems():
            if k not in conflicting and result.setdefault(k,v) != v:
                del result[k]
                conflicting.add(k)
    return result

设置冲突只包含字典键,它始终是可清除的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读