【问题标题】:Compare two collections.defaultdict and remove similar values比较两个 collections.defaultdict 并删除相似的值
【发布时间】:2021-12-07 10:25:42
【问题描述】:

我有两个collections.defaultdict 并试图从d1 中删除也在d2 中的值。

from collections import Counter, defaultdict
d1 = Counter({'hi': 22, 'bye': 55, 'ok': 33})
d2 = Counter({'hi': 10, 'hello': 233, 'nvm': 96})

理想结果:

d3 = set()
d3 = ({'bye':55, 'ok':33})

到目前为止我已经尝试过:

d3 = set()
d3 = d1 - d2
print(d3)
Counter({'bye': 55, 'ok': 33, 'hi': 12}) 

但这会保持 'hi' 的相同值,即使我想删除所有相似的值。

【问题讨论】:

    标签: python collections counter defaultdict


    【解决方案1】:

    由于d1 和d2 是Counter 对象,它们实现的减法不同于集合。

    来自collections.Counter(强调我的):

    加法和减法通过添加或相应元素的计数来组合计数器。

    来自set.difference or set - other:

    返回一个新集合,该集合中的元素不在其他集合中。

    也就是说,您可以像集合一样使用Counter.keys 和difference。

    keys = d1.keys() - d2.keys()
    # keys = {'bye', 'ok'}
    
    out = {k: d1[k] for k in keys}
    # out = {'bye': 55, 'ok': 33}
    

    【讨论】:

    • 作为后续行动 - 我将如何仅比较 d1 的前 2 个值与 d2 的前 2 个值? (因为不能做 d1[:2] 并且 err 是 'unhashable type :slice'')
    • '前 2 个值'按值排序?
    • @dawg 是的
    • d1.most_common(2) 获取 2 个最大值。 d1.most_common(2).keys() - d2.most_common(2).keys()
    • @dawg 有完美的解决方案@sarah 这是Counter.most_common的链接
    【解决方案2】:

    使用字典理解

    d3 = {k: v for k, v in d1.items() if k not in d2}
    print(d3)
    

    结果:

    {'bye': 55, 'ok': 33}
    

    【讨论】:

      【解决方案3】:

      试图从d1 中删除也在d2 中的值

      for k in d2:
          d1.pop(k, None)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        相关资源
        最近更新 更多