通过not-always-there属性对对象dict进行排序

时间:2014-11-19 11:30:53

标签: python sorting

我想在python中对对象字典进行排序。这些对象有一个属性,我们称之为" architecture"。所以,为了对我的字典进行排序,我这样做:

data.sort(key=attrgetter('architecture'))

到目前为止一切顺利。

但是,有些对象不具备属性' architecture' (有时是,有时没有)和python控制台引发了AttributeError异常。

所以,我的问题是,当某些对象没有要排序的属性时,如何按属性对对象字典进行排序?

3 个答案:

答案 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'字段进行调整。