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

为什么在Python中不能统一处理集合?

发布时间:2020-12-16 23:06:48 所属栏目:Python 来源:网络整理
导读:集合和列表在 Python中的处理方式不同,似乎没有统一的方法可以同时使用它们.例如,使用add方法将项添加到集合中,对于列表,使用append方法完成.我知道这背后有不同的语义,但也存在常见的语义,并且通常与某些集合一起使用的算法更多地关注共性而不是差异. C STL
集合和列表在 Python中的处理方式不同,似乎没有统一的方法可以同时使用它们.例如,使用add方法将项添加到集合中,对于列表,使用append方法完成.我知道这背后有不同的语义,但也存在常见的语义,并且通常与某些集合一起使用的算法更多地关注共性而不是差异. C STL表明这可以工作,为什么Python中没有这样的概念?

编辑:在C中,我可以使用output_iterator将值存储在(几乎)任意类型的集合中,包括列表和集合.我可以编写一个算法,它将这样的迭代器作为参数并将元素写入其中.然后,该算法完全不知道支持迭代器的容器(或其他设备,可能是文件)的类型.如果后备容器是忽略重复项的集合,那么这是调用者的决定.我的具体问题是,现在我已经多次使用过,例如我用了一个特定任务的列表,然后决定该集更合适.现在我必须更改附加内容以添加到我的代码中的几个位置.我只是想知道为什么Python没有这种情况的概念.

解决方法

直接回答:这是一个设计缺陷.

您应该能够使用相同的方法名称插入任何通用插入有意义的容器(例如,排除dict).插入应该有一致的通用名称,例如.添加,对应于set.add和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

(编辑:李大同)

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

    推荐文章
      热点阅读