首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将defaultdict键值与另一个defaultdict进行比较。

将defaultdict键值与另一个defaultdict进行比较。
EN

Stack Overflow用户
提问于 2017-09-19 02:53:22
回答 3查看 2.9K关注 0票数 4

我有两个defaultdict

代码语言:javascript
复制
defaultdict(<type 'list'>, {'a': ['OS', 'sys', 'procs'], 'b': ['OS', 'sys']})

defaultdict(<type 'list'>, {'a': ['OS', 'sys'], 'b': ['OS']})

如何比较这两个值,以获得每个值中缺失的值。例如,对于键'a',我应该得到第二个defaultdict中缺少的两个值,以及'b'中缺少的一个值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-19 03:03:37

如果您只想从第二个默认的dict中丢失总数,可以迭代第一个dict,并查看设置的差异,找出A中相对于B还有多少东西。

如果你像这样定义这些词:

代码语言:javascript
复制
a = defaultdict(list, {'a': ['OS', 'sys', 'procs'], 'b': ['OS', 'sys']})
b = defaultdict(list, {'a': ['OS', 'sys'], 'b': ['OS']})

这将告诉您在dict中丢失了多少:

代码语言:javascript
复制
total_missing_inB = 0
for i in a:
    diff = set(a[i]) - set(b[i])
    total_missing_inB += len(diff)

这会告诉你有多少人从dict

代码语言:javascript
复制
total_missing_inA = 0
for i in b:
    diff = set(b[i]) - set(a[i])
    total_missing_inA += len(diff)
票数 0
EN

Stack Overflow用户

发布于 2017-09-19 03:01:17

您应该能够使用set差异来最有效地查找(和计数)缺少的元素。如果您非常小心,您甚至可以在不向defaultdict添加项的情况下做到这一点(并且不需要假设函数输入是defaultdict)。

从那以后,就变成了把这些结果积累到字典里的问题。

代码语言:javascript
复制
def compare_dict_of_list(d1, d2):
    d = {}
    for key, value in d1.items():
        diff_count = len(set(value).difference(d2.get(key, [])))
        d[key] = diff_count
    return d
票数 1
EN

Stack Overflow用户

发布于 2017-09-19 04:12:27

在这里,我们提出了一种使用collections.Counter跟踪值的替代解决方案,并考虑了一些与不常见的键和值有关的边缘情况。

代码语言:javascript
复制
import collections as ct


def compare_missing(d1, d2, verbose=False):
    """Return the count of missing values from dict 2 compared to dict 1."""
    record = {}
    for k in d1.keys() & d2.keys():
        a, b = ct.Counter(d1[k]), ct.Counter(d2[k])
        record[k] = a - b
    if verbose: print(record)
    return sum(v for c in record.values() for v in c.values())

Demo

代码语言:javascript
复制
dd0 = ct.defaultdict(list, {"a": ["OS", "sys", "procs"], "b": ["OS", "sys"]})
dd1 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS"]})

compare_missing(dd0, dd1, True)
# {'a': Counter({'procs': 1}), 'b': Counter({'sys': 1})}
# 2

compare_missing(dd1, dd0, True)
# {'a': Counter(), 'b': Counter()}
# 0

详细信息

如果两个字典中的键不相同,compare_missing只会迭代公共键。在下一个示例中,即使向c添加了一个新键( dd1 ),我们也得到了与上面相同的结果:

代码语言:javascript
复制
dd2 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS"], "c": ["OS"]})
compare_missing(dd0, dd2)
# 2

compare_missing(dd2, dd0)
# 0

如果发现不常见的值或复制("admin""OS"分别在dd3[b]中),则也会计算这些事件:

代码语言:javascript
复制
dd3 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS", "admin", "OS"]})
compare_missing(dd3, dd0, True)
# {'a': Counter(), 'b': Counter({'OS': 1, 'admin': 1})}
# 2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46291035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档