1

我有一个 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

4 回答 4

4

您的代码失败,AttributeError因为您试图id在一个dict对象中进行查找,而该对象没有。您需要访问所需的字典键:

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

KeyError但是,如果列表中至少有一个条目没有id密钥,则该操作将失败。在这种情况下,您可以使用:

sorted(demo, key=lambda x: x.get("id"))

get如果您希望将所有条目放在其余条目的id上方或下方,则可以选择在 中使用默认值。在这种情况下,以下内容会将带有 noid的条目发送到底部:

排序(演示,键=lambda x:x.get(“id”,“99”))


也可能发生你有一个id喜欢12#10并且你不希望它在 and 之间12#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使用该比较函数调用:

sorted(demo, cmp=compare)

或者在 Python 3 中, wherecmp已被淘汰:

from functools import cmp_to_key
sorted(demo, key=cmp_to_key(compare))
于 2013-08-05T11:05:00.883 回答
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 对 ASC 进行排序,按年龄对 DESC 进行排序,您可以进行如下操作:

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'}
于 2013-08-05T10:41:19.787 回答
1

Ifdemo是列表(注意括号和逗号)

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'}]
于 2013-08-05T10:39:53.657 回答
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'}]
于 2013-08-05T10:40:32.967 回答