当前位置: 首页 > 面试题库 >

添加计数器会删除密钥

胡浩瀚
2023-03-14
问题内容

如下所示,为什么+=在我的原始计数器中实现吹走密钥?

>>> c = Counter({'a': 0, 'b': 0, 'c': 0})
>>> c.items()
[('a', 0), ('c', 0), ('b', 0)]
>>> c += Counter('abba')
>>> c.items()
[('a', 2), ('b', 2)]

我认为这至少是不礼貌的,“
X被计数0次”和“我们什至没有计算Xs”之间都有很大的区别。似乎collections.Counter根本不是一个计数器,它更像是一个多集。

但是计数器是dict的子类, 我们可以将其构造为零或负值:Counter(a=0, b=-1)。如果它实际上是“一袋东西”,这是否不被禁止,限制init接受可迭代的可哈希项?

为了进一步混淆事务,计数器实现updatesubtract方法的行为与+-操作员不同。看来这堂课有身份危机!

柜台是字典还是书包?


问题答案:

从源头上;

def __add__(self, other):
    '''Add counts from two counters.

    >>> Counter('abbb') + Counter('bcc')
    Counter({'b': 4, 'c': 2, 'a': 1})

    '''
    if not isinstance(other, Counter):
        return NotImplemented
    result = Counter()
    for elem, count in self.items():
        newcount = count + other[elem]
        if newcount > 0:
            result[elem] = newcount
    for elem, count in other.items():
        if elem not in self and count > 0:
            result[elem] = count
    return result

似乎Counter实现为删除 键,这些键的总和为零 。由于默认值为零,并且源也为零,因此结果字典不包含该键。

也许您可以通过update获得相同的行为:

a.update(b)

似乎可以满足您的要求。可能较慢,该__add__方法的手工实现会快得多。



 类似资料:
  • 嗨,我有以下代码。该代码处于 for 循环中,它生成了 300 多个绘图。 我已经查看了下面的链接(以及更多): 删除垫图中的 xtick? https://datascience.stackexchange.com/questions/48035/how-to-show-percentage-text-next-to-the-horizontal-bars-in-matplotlib 当我尝试第

  • 添加/删除光晕是一组API,可以控制是否在3D地球周围显示 光晕 。 当使用addHalo() API添加光晕时,可以指定光晕颜色。默认设置下光晕是启用的。 controller.addHalo(0xFF0000); controller.removeHalo();

  • 主要内容:JSF数据表添加删除实例JSF中有一个叫作的控件,可用来渲染和格式化表格。使用,我们可以迭代收集或数组数组来显示数据。 具有以简单的方式修改其数据的属性。 要使用,我们需要添加以下HTML头。 以下JSF标签 - 被渲染成以下HTML标签。 JSF数据表添加删除实例 打开 NetBeans IDE 创建一个Web工程:DataTableAddDelete,其目录结构如下所示 - 创建以下文件代码,文件:index.xht

  • 问题内容: 我正在尝试创建一个代码块,该代码块将创建一个链接服务器/删除一个链接服务器。我曾发布过有关添加和删除函数的类似问题,解决方案是删除函数并重新创建它。 因此,我想对LinkServer采用相同的方法。每次运行此代码时,请删除它并重新创建它。 但是,删除后无法重新创建链接服务器,并且收到错误消息:服务器已存在。 这是我的代码: 问题答案: 实际上,这至少是SQL Server的副本:链接服

  • 问题内容: 嗨,我必须从一个JList中选择一个元素,将其从第一个元素中删除。我创建的方法仅插入一个元素,覆盖最后一个元素,并且不会从第一个JList中删除所选项目。这是代码: 第一名单 通过此方法填充: 第二个列表,我要在其中插入从第一个列表中删除的项目: 这是无效代码: 谢谢 问题答案: 问题是 您可能要添加一个元素并立即将其删除,因为添加和删除操作都在同一listModel上。 尝试

  • ADDING AND REMOVING SOFTWARE Linux 或任何操作系统中最基本的任务之一便是添加和删除软件。您经常需要安装发行版中没有附带的软件,或者删除不需要的软件,这样就不会占用硬盘空间。 有些软件安装需要依赖其他软件才能运行,有时您会发现您可以在软件包安装过程中一次性下载所需的所有软件,软件包是一组文件(通常是库和其他依赖项),您需要这些文件才能使软件成功运行。当您安装一个包时