Gor*_*ley 4 python dictionary list set
有没有文章或论坛讨论或某些地方解释为什么列表使用append/extend但设置和dicts使用添加/更新.
我经常发现自己将列表转换为集合,这种差异使得这非常繁琐,所以对于我的个人理智,我想知道合理化是什么.
当我们迭代开发时,需要在这些之间进行转换.随着时间的推移,程序的结构会变形,各种结构会增加并失去排序和重复等要求.
例如,一些以列表中的无序内容开头的东西可能会提出不需要重复的要求,因此需要转换为集合.
所有这些更改都需要查找和更改添加/附加和扩展/更新相关结构的所有位置.
所以我很想看到导致这种语言选择的原始讨论,不幸的是我没有用谷歌搜索它.
append有一个流行的定义"添加到最后",并且extend可以类似地阅读(在细微差别,它意味着"......超出某一点"); 集合没有"结束",也没有任何方式在它们内部或"在它们的边界"指定一些"点"(因为没有"边界"!),因此建议可以执行这些操作将是非常误导的.
x.append(y)总是增加len(x)一个(无论是否y已列入清单x); 没有这样的断言s.add(z)(s长度可以增加或保持不变).而且,在这些片段中,y可以有任何值(即,追加操作永远不会失败[除了你的内存耗尽的异常情况]) - 再次没有这样的断言z(必须是可以清除的,否则添加操作失败并引发异常).类似差异适用于extendVS update.对于这种完全不同语义的操作使用相同的名称将是非常误导确实如此.
在第一遍中使用列表并在稍后的迭代中处理性能似乎是pythonic
性能是最不重要的! lists支持重复项目,订购和任何项目类型 - sets保证项目唯一性,没有订单概念,以及需求项目可靠性.Pythonic没有使用列表(加上对副本等的愚蠢检查)代表一套 - 性能与否,"说出你的意思!" 是Pythonic方式;-).(在诸如Fortran或C之类的语言中,作为内置容器类型的所有内容都是数组,如果您需要避免使用附加库,则可能必须执行此类"mental mapping";在Python中,没有这样的需要).
编辑:OP在评论中断言他们从一开始就不知道(例如)在某个算法中不允许重复(奇怪,但是,无论如何) - 他们正在寻找一种无痛的方式来制作一个列表一旦他们确实发现副本是不好的(并且,我将添加:顺序无关紧要,项目可以清除,索引/切片不需要等).如果Python set有两个方法的"同义词",那么就可以获得完全相同的效果:
class somewhatlistlikeset(set):
def append(self, x): self.add(x)
def extend(self, x): self.update(x)
Run Code Online (Sandbox Code Playgroud)
当然,如果唯一的变化是在创建集合(以前是列表创建),则代码可能更难以遵循,失去了有用的清晰度,因此使用addvs append允许任何阅读代码的人知道"本地"是否对象是一个集合与列表......但这也是上述"完全相同的效果"的一部分! - )
| 归档时间: |
|
| 查看次数: |
6860 次 |
| 最近记录: |