python自定义数据操作
应该是你sorted的使用方式不对吧,它可以对name.key这样的形式进行排序的。
class m:
def __init__(self,name,id):
self.name=name
self.id=id
@property
def key(self):
return self.name
def len(self):
return len(self.name)
def __str__(self):
return '{{\'name\':\'{0}\',\'id\':{1}}}' \
.format(self.name,self.id)
__repr__ = __str__
s = [m('zzzz',1),m('aaa',4)]
l = [('source', s),
]
# 直接属性排序
l.append(('by name', sorted(s, key=lambda x: x.name)))
l.append(('by id', sorted(s, key=lambda x: x.id)))
# 属性函数排序
l.append(('by key', sorted(s, key=lambda x: x.key)))
# 函数排序
l.append(('by len()', sorted(s, key=lambda x: x.len())))
for e in l:
print(e[0])
print(e[1])
这是输出的结果:
source
[{'name':'zzzz','id':1}, {'name':'aaa','id':4}]
by name
[{'name':'aaa','id':4}, {'name':'zzzz','id':1}]
by id
[{'name':'zzzz','id':1}, {'name':'aaa','id':4}]
by key
[{'name':'aaa','id':4}, {'name':'zzzz','id':1}]
by len()
[{'name':'aaa','id':4}, {'name':'zzzz','id':1}]
上述四种用法都是没问题的,至于name[key]的形式同样是OK的。
sorted的参数key,它是一个函数,简单的话可以直接用lambda,复杂点的可以定义成有一个参数的函数,比如:
def sorted_other(item):
if hasattr(item, 'name'):
return item.name
else:
return None
l.append(('by other func', sorted(s, key=sorted_other)))