如何在Python列表中自定义排序?

时间:2013-08-05 10:37:49

标签: python

我有一个Python列表如下,

demo= {'age': 90, 'id': '12#2'}
{'age': 12, 'id': '12#3'}
{'age': 67, 'id': '12#1'}
{'age': 56, 'id': '12#2'}
{'age': 34, 'id': '12#2'}

如何使用id属性对此列表进行排序?

我试过了

sorted(demo, key=lambda x: x.id)   # sort by id

但失败了。

预期输出如下:

{'age': 90, 'id': '12#2'}
{'age': 56, 'id': '12#2'}
{'age': 34, 'id': '12#2'}
{'age': 12, 'id': '12#3'}
{'age': 67, 'id': '12#1'}

4 个答案:

答案 0 :(得分:1)

如果demo是列表(请注意括号和逗号)

demo= [{'age': 90, 'id': '12#2'},
       {'age': 12, 'id': '12#3'},
       {'age': 67, 'id': '12#1'},
       {'age': 56, 'id': '12#2'},
       {'age': 34, 'id': '12#2'}]

然后你可以用id对它进行排序:

sorted(demo, key=lambda x: x['id']) 

例如:

In [5]: sorted(demo, key=lambda x: x['id']) 
Out[5]: 
[{'age': 67, 'id': '12#1'},
 {'age': 90, 'id': '12#2'},
 {'age': 56, 'id': '12#2'},
 {'age': 34, 'id': '12#2'},
 {'age': 12, 'id': '12#3'}]

答案 1 :(得分:1)

demo= [{'age': 90, 'id': '12#2'},
{'age': 12, 'id': '12#3'},
{'age': 67, 'id': '12#1'},
{'age': 56, 'id': '12#2'},
{'age': 34, 'id': '12#2'}]

a = sorted(demo, key=lambda x: x['id'])

for el in a:
    print el

给出

{'age': 67, 'id': '12#1'}
{'age': 90, 'id': '12#2'}
{'age': 56, 'id': '12#2'}
{'age': 34, 'id': '12#2'}
{'age': 12, 'id': '12#3'}

按ID排序。

按多个属性排序

demo= [{'age': 90, 'id': '12#2'},
{'age': 12, 'id': '12#3'},
{'age': 67, 'id': '12#1'},
{'age': 56, 'id': '12#2'},
{'age': 34, 'id': '12#2'}]

a = sorted(demo, key=lambda x: (x['id'], x['age']))

for el in a:
    print el

给出

{'age': 67, 'id': '12#1'}
{'age': 34, 'id': '12#2'}
{'age': 56, 'id': '12#2'}
{'age': 90, 'id': '12#2'}
{'age': 12, 'id': '12#3'}   

首先按id排序,然后按年龄(升序)排序。

或者,如果您想按年龄对ID和DESC进行ASC排序,可以这样做:

demo= [{'age': 90, 'id': '12#2'},
{'age': 12, 'id': '12#3'},
{'age': 67, 'id': '12#1'},
{'age': 56, 'id': '12#2'},
{'age': 34, 'id': '12#2'}]

a = sorted(demo, key=lambda x: (x['id'], -x['age']))

for el in a:
    print el

给出了

{'age': 67, 'id': '12#1'}
{'age': 90, 'id': '12#2'}
{'age': 56, 'id': '12#2'}
{'age': 34, 'id': '12#2'}
{'age': 12, 'id': '12#3'}

答案 2 :(得分:0)

您的示例不包含列表,您需要在字典周围添加[]。我已经为你解决了这个问题:

>>> demo= [{'age': 90, 'id': '12#2'},
{'age': 12, 'id': '12#3'},
{'age': 67, 'id': '12#1'},
{'age': 56, 'id': '12#2'},
{'age': 34, 'id': '12#2'}]
>>> sorted(demo, key=lambda x: x['id'])
[{'age': 67, 'id': '12#1'}, 
{'age': 90, 'id': '12#2'}, 
{'age': 56, 'id': '12#2'}, 
{'age': 34, 'id': '12#2'}, 
{'age': 12, 'id': '12#3'}]

答案 3 :(得分:0)

您的代码因AttributeError而失败,因为您试图在id对象中查找dict,但没有sorted(demo, key=lambda x: x['id']) 对象。您需要访问所需的字典键:

KeyError

但是,如果列表中至少有一个条目没有id密钥,那么sorted(demo, key=lambda x: x.get("id")) 将失败。在这种情况下,您可以使用:

get

如果您希望将所有条目({1}}放在其余条目之上或之下,则可以使用id中的默认值。在这种情况下,以下内容会将没有id的条目发送到底部:

排序(demo,key = lambda x:x.get(“id”,“99”))


您可能还会遇到类似id的{​​{1}},并且您不希望它位于12#1012#1之间。要解决该问题,您需要拆分12#2并具有更复杂的排序功能。

id

然后使用该比较函数调用def get_values(item): return [int(x) for x in item['id'].split('#')] def compare(a, b): a = get_values(a) b = get_values(b) if not a[0] == b[0]: return a[0] - b[0] return a[1] - b[1]

sorted

或者在Python 3中,sorted(demo, cmp=compare) 已被淘汰:

cmp