python list按照某个字段排序,python list嵌套list

  python list按照某个字段排序,python list嵌套list

  属性树

  第一个规范的问题是,Python无法在__getitem__中判断,如果在我的时,下一步将继续深入到不存在的树中,在这种情况下,它需要返回一个带有__getitem__方法的对象,这样就不会向您抛出AttributeError,或者如果您想要一个值,在这种情况下,它需要返回没有。

  我认为在上面的每一种情况下,您应该期望它抛出一个KeyError,而不是返回没有。原因是你无法判断没有人是否意味着"没有密钥"或者"有人实际存储了没有人在那个位置"。对于此行为,您只需采取溺爱,删除记号笔,并将__getitem__替换为:def __getitem__(self,key):

  返回自己[键]

  因为你真正想要的是一个带__getattr__和__setattr__的字典。

  可能有一种方法可以完全删除__getitem__,并说一些类似__getattr__=字典.__getitem__的话,但我认为这可能是过度优化,如果您以后决定要__getitem__按照原来的溺爱方式创建树,那么这将是一个问题,在这种情况下,您可以将其更改为:def __getitem__(self,key):

  如果密钥不在自身中:

  迪克特. self _ _ setitem _ _(self,key,dotdictify())

  返回字典__getitem__(self,key)

  我不喜欢原来的标记业务。

  路径支持

  第二个规范(覆盖获取()和set())是一个普通的词典有一个get(),它的操作与您描述的不同,甚至没有一个设置(尽管它有一个setdefault(),这是获取()的逆操作)。人们希望得到接受两个参数,如果找不到密钥,则第二个参数是默认值。

  如果要扩展__getitem__和__setitem__来处理点键表示法,则需要将doctictify修改为:class dotdictify(dict):

  def __init__(self,value=None):

  如果值为无:

  及格

  elif isinstance(value,dict):

  对于键入值:

  自我. setitem__(key,value[key])

  否则:

  引发类型错误,预期字典

  def __setitem__(self,key,value):

  如果"."调:

  myKey,restOfKey=key.split( . )), 1)

  target=self.setdefault(myKey,dotdictify())

  如果不是isinstance(target,dotdictify):

  引发KeyError,无法设置“%s”(在“% s”(% s)%(restof key,myKey,repr(target))中)

  target[restOfKey]=值

  否则:

  如果是isinstance(值,字典)而不是isinstance(value,dotdictify):

  value=dotdictify(值)

  迪克特. setitem__(自身,关键字,值)

  def __getitem__(self,key):

  如果"."不在调中:

  返回字典__getitem__(self,key)

  myKey,restOfKey=key.split( . )), 1)

  目标=字典__getitem__(self,myKey)

  如果不是isinstance(target,dotdictify):

  引发KeyError,无法获取“%s”在“% s”(% s)%(restof key,myKey,repr(target))中

  返回目标[恢复键]

  def __contains__(self,key):

  如果"."不在调中:

  返回字典。__包含_ _(自身,密钥)

  myKey,restOfKey=key.split( . )), 1)

  目标=字典__getitem__(self,myKey)

  如果不是isinstance(target,dotdictify):

  返回错误的

  在目标中返回restOfKey

  def setdefault(self,key,default):

  如果密钥不在自身中:

  self[key]=默认

  返回自己[键]

  __setattr__=__setitem__

  __getattr__=__getitem__

  测试代码:life=dotdictify({ 大爆炸:{ 恒星:{ 行星:{ } })

  生命,大爆炸,恒星,行星

  {}

  生活。大爆炸。星星。行星。earth={ 单细胞生命:{ } }

  生命,大爆炸,恒星,行星

  { 地球:{ 单细胞生命:{}}}

  生命[大爆炸。恒星。行星。火星。登陆者。维京人]=2

  生命。大爆炸。恒星。行星。火星。登陆者。维京人

  2

  生活中的登陆者、维京人、大爆炸、恒星、行星、火星

  真实的

  生活。得到(‘大爆炸。星星。行星。火星。兰德斯。精神,真实)

  真实的

  生活。设置默认(‘大爆炸。星星。行星。火星。兰德斯。“机会”,真)

  真实的

  着陆器。生命中的机遇。大爆炸。恒星。行星。火星

  真实的

  生命。大爆炸。恒星。行星。火星

  {landers: {opportunity: True, vikings: 2}}

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: