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(使用前将#替换为@)