我想在python中对对象字典进行排序。这些对象有一个属性,我们称之为" architecture"。所以,为了对我的字典进行排序,我这样做:
data.sort(key=attrgetter('architecture'))
到目前为止一切顺利。
但是,有些对象不具备属性' architecture' (有时是,有时没有)和python控制台引发了AttributeError异常。
所以,我的问题是,当某些对象没有要排序的属性时,如何按属性对对象字典进行排序?
答案 0 :(得分:0)
假设你想把没有属性的那些放在最后。
from operator import attrgetter
data_with_attr = list(d for d in data.values() if hasattr(d, 'architecture'))
data_with_attr.sort(key=itemgetter('architecture'))
data_with_attr += list(d for d in data.values() if not hasattr(d, 'architecture'))
我不确定我是否正确理解object dictionary
。
答案 1 :(得分:0)
检查对象是否具有该属性,并使用float("inf")
或float("-inf")
,具体取决于您希望对象不具有要排序的对象的位置:
srt = sorted(d,key=lambda x: d[x].architecture if hasattr(d[x], "architecture") else float("inf"))
如果您想要键和值使用项目:
srt= (sorted(d.items(),key=lambda x: x[1].architecture if hasattr(x[1], "architecture") else float("inf")))
dicts没有.sort
方法
答案 2 :(得分:0)
我讨厌,我不能只评论......
您想如何排序字典?字典使用哈希来访问键,因此当迭代它们时,顺序取决于键哈希而不是键自己。因此,字典(通常)不提供排序。
但是关于你原来的问题(我现在在(key, value)
- 列表中预测这个问题),这个怎么样:
ndata = sorted((tpl for tpl in data if hasattr(tpl[0], 'architecture')),
key=lambda x: getattr(tpl[0], 'architecture'))
# if you want to add those entries, not having 'architecture':
ndata += list(set(data) - set(ndata))
现在的问题是:你想对这些条目做什么,而不是对'architecture'
字段进行调整。