为什么 Python 中对集合的处理不统一?

2024-01-26

Python 中集合和列表的处理方式不同,并且似乎没有统一的方法来处理这两者。例如,将一个项目添加到set是使用完成的add方法,并且对于list它是使用完成的append方法。我知道这背后有不同的语义,但也有共同的语义,并且通常与某些集合一起使用的算法更关心共性而不是差异。 C++ STL表明这是可行的,那么为什么Python中没有这样的概念呢?

Edit:在 C++ 中我可以使用output_iterator http://www.sgi.com/tech/stl/OutputIterator.html将值存储在(几乎)任意类型的集合中,包括列表和集合。我可以编写一个算法,将这样的迭代器作为参数并向其中写入元素。该算法完全不知道支持迭代器的容器(或其他设备,可能是文件)的类型。如果后备容器是一个忽略重复项的集合,那么这是调用者的决定。我的具体问题是,现在我使用了例如list为了某项任务,后来决定set更合适。现在我必须改变append to add在我的代码中的几个地方。我只是想知道为什么Python对这种情况没有概念。


直接答案:这是一个设计缺陷。

您应该能够使用相同的方法名称插入到任何通用插入有意义的容器中(例如,不包括 dict)。应该有一个一致的、通用的插入名称,例如。add,对应于set.add and list.append,因此您可以添加到容器中,而不必太关心要插入的内容。

在不同类型中对此操作使用不同的名称是一种无端的不一致,并且设置了一个糟糕的基本标准:库应该鼓励用户容器使用一致的 API,而不是为每个基本容器提供很大程度上不兼容的 API。

也就是说,在这种情况下,这通常不是一个实际问题:大多数情况下,函数的结果是项目列表,将其实现为生成器。它们允许一致地处理这两者(从函数的角度来看),以及其他形式的迭代:

def foo():
    yield 1
    yield 2
    yield 3

s = set(foo())
l = list(foo())
results1 = [i*2 for i in foo()]
results2 = (i*2 for i in foo())
for r in foo():
    print r
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 中对集合的处理不统一? 的相关文章

随机推荐

  • 从 SSIS 目录执行包时无法访问网络共享

    我目前遇到一个问题 我可以从 SQL Server Data Tools 完美地执行包 但在尝试从 SSIS 目录中执行时出现以下错误 文件系统任务 错误 发生错误 并显示以下错误消息 访问路径 xxxxxxxx xxxx 被拒绝 我使用相
  • 定义Windows Phone中PhoneTextBox的样式

    我正在重写 PhoneTextBox 的样式 将默认背景更改为 透明 将前景更改为 白色 将 BorderBrush 更改为 白色 因为我想设计一个深色主题 但是出现了一个问题 文本输入指示器消失了 我感谢原因是文本输入指示器的前景是黑色的
  • apache Drill 是否可以执行更新、删除、插入操作

    众所周知 apache Drill 很容易查询 但我有一些问题如下 First 如果apache Drill可以对HDFS执行更新 删除 插入操作 Second 如果第一个问题的答案是肯定的 我如何使用 apache Drill 在 HDF
  • Objective-c:使用带有导航栏的第二个视图启动应用程序

    我正在为 iPad 创建一个应用程序 我创建了 3 个带有导航栏的视图 但我想不在第一个视图中启动我的应用程序 而是在第二个视图中启动我的应用程序 我该怎么办 您可以设置UI导航控制器 http developer apple com li
  • 编写一个 Rust 宏重复,它可能会也可能不会初始化结构体字段

    我正在尝试编写一个列出多个结构字段的宏 但有条件地仅从列表中的某些字段创建初始化程序代码 具体来说 可能看起来像这样 test fn test derive PartialEq Debug struct Foo bar usize let
  • 批量验证 yaml 文件

    我需要验证一大堆 YAML 文件 我尝试了 yaml 在线解析器 http yaml online parser appspot com http yaml online parser appspot com 效果很完美 但是将每个 YAM
  • 将 HttpContent 转换为 byte[]

    我目前正在开发 C Web API 对于特定调用 我需要使用 ajax 调用 API 发送 2 个图像 以便 API 可以将它们以 varbinary max 形式保存在数据库中 你如何提取一个Image or byte from a Ht
  • 如何打开没有菜单项的侧边栏?

    是否可以打开侧边栏而无需打开菜单并单击某个项目 我的意思是我们可以添加一个像按钮一样的菜单并在单击时打开侧边栏吗 我知道的最短的方法是将单个项目添加到菜单中 function onOpen e SpreadsheetApp getUi cr
  • 如何在 quill 编辑器中使用 v-model

    我用的是Vue 3 我以前用过这个 效果很好
  • mysql:信息架构上的访问被拒绝

    当我创建新用户或向现有用户授予权限时 出现此错误 ERROR 1045 28000 Access denied for user root localhost using password YES 对除 information schema
  • 迭代范围内的单元格时出现类型不匹配错误

    您好 我正在尝试在电子表格上运行以下 vb 代码 但在范围内出现数据类型不匹配的错误 我只是想锁定值为 0 的单元格 有些单元格的值为 NA 有什么想法吗 Sub Test Dim Cell As Range Set MyPlage Ran
  • Maven glassfish 嵌入式插件中的 JSP 热插拔

    我正在尝试设置嵌入式 glassfish maven 插件并且成功了 但是我无法使 jsp 文件热交换 这是我的配置
  • 10k 租户和多租户数据库设计 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在尝试为新的 Web 应用程序决定数据库设计 我们预计将有近 10 000 个租户 并且希望将他们的数据保存在单独的数据库中 如
  • Qt iOS 运行失败

    当我尝试在 iOS 模拟器上运行我的应用程序时 应用程序输出 I see Starting remote process Run ended 当我尝试在 iPhone 上运行它时 Issues I see xcodebuild failed
  • 如何在休眠中为自身实体添加@onetoone映射

    如何为自身实体添加一对一映射 就像这个例子一样 我想为 Person 本身建立父子关系 Entity Table name PERSON public class Person Id Column name personId private
  • 在 make 中“触及”目标是什么意思?

    例如 从 mingw32 make exe help 选项 t touch Touch targets instead of remaking them 它只是意味着更新文件修改时间 这样下次就不会认为这些文件是旧的
  • CSS - 在电脑上分屏但在移动设备上堆叠

    我试图将我的页面分成 4 个相等的部分 我想将左上角水平分成 2 个部分 我主要关心的是它在移动设备上的表现 我不希望它像在电脑上那样被分割 我希望它被堆叠起来 块在另一个上面 如图所示 我想过引导网格 但我做不到 到目前为止我所拥有的内容
  • 如何使用量角器+角度获取迭代器索引/键?

    通过中继器查找元素时有没有办法访问迭代器索引 键 protractor By repeater id cat in pets 在本例中 我希望访问猫的 id id 不是表中显示为值的列之一 它用于导航ng click goto pets c
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败

    我在用Authlogic 连接 https github com viatropos authlogic connect用于第三方登录 运行适当的迁移后 Twitter Google yahoo 登录似乎工作正常 但 facebook 登录
  • 为什么 Python 中对集合的处理不统一?

    Python 中集合和列表的处理方式不同 并且似乎没有统一的方法来处理这两者 例如 将一个项目添加到set是使用完成的add方法 并且对于list它是使用完成的append方法 我知道这背后有不同的语义 但也有共同的语义 并且通常与某些集合