我有一些我要排序的自定义对象和词典。我想将字典对象排序在一起。我想通过一个属性和字典按键对对象进行排序。
object.name = 'Jack'
d = {'name':'Jill'}
sort_me =[object, d]
如何使用对象的name属性和字典的'name'键对此列表进行排序?
答案 0 :(得分:8)
你几乎肯定要找的是对sorted()使用key =选项,它提供了一个为每个元素返回任意排序键的函数。此函数可以检查其参数的类型并执行各种操作。例如:
import types
class obj(object):
def __init__(self, arg):
self.name = arg
def extract_name(obj):
if type(obj) is types.DictType:
return obj['name']
else:
return obj.__dict__['name']
d = { 'name': 'Jill'}
print sorted([obj('Jack'), d], key=extract_name)
可以在Python wiki
上找到更多信息RichieHindle建议使用isinstance是一个很好的建议。当我在它的时候,我认为支持任意元素名称而不是硬编码'name'可能会很好:
def extract_elem_v2(elem_name):
def key_extractor(obj):
dct = obj if isinstance(obj, dict) else obj.__dict__
return dct[elem_name]
return key_extractor
您可以这样使用:
print sorted(list_of_stuff, key=extract_elem_v2('name'))
答案 1 :(得分:2)
sort_me.sort(key=attr_or_itemgetter('name'))
attr_or_itemgetter()
:
class attr_or_itemgetter(object):
def __init__(self, name):
self.name = name
def __call__(self, obj):
try: return getattr(obj, name)
except AttributeError:
return obj[name]
注意:它故意不检查字典类型,因此应用于字典的attr_or_itemgetter('items')
将返回dict.items
方法。
答案 2 :(得分:1)
这对我有用。请注意,sort()
不会返回已排序的列表,但sorted()
会返回,因此如果您要将其传递给模板,则应在参数中使用sorted
,或sort
在将列表作为参数传递之前。
itemized_action_list = list(chain(detection_point.insertbodyaction_set.all(),
detection_point.insertheaderaction_set.all(),
detection_point.modifybodyaction_set.all(),
detection_point.modifyheaderaction_set.all(),
detection_point.removebodyaction_set.all(),
detection_point.removeheaderaction_set.all(),
detection_point.redirectaction_set.all()))
sorted(itemized_action_list, key=attrgetter('priority'))
答案 3 :(得分:0)
new_list = [10,“ m”,20,30,“ a”,“ r”,70,“ d”]
def func(x):
if type(x) == str:
return ord(x)+100
return x
new_list.sort(key = func)
打印(新列表)
[10,20,30,70,'a','d','m','r']