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

如何在Python列表中自定义排序?,python,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

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

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

然后,您可以按
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'}]

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

然后,您可以按
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'}]

您的示例没有包含列表,您需要在字典周围有
[]
。我已经为您确定了:

>>> 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'}]

您的示例没有包含列表,您需要在字典周围有
[]
。我已经为您确定了:

>>> 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'}]
给予

它是按id排序的

按多个属性排序 给予

首先按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'}
给予

它是按id排序的

按多个属性排序 给予

首先按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'}

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

sorted(demo, key=lambda x: x['id'])
但是,如果列表中至少有一个条目没有
id
键,则该操作将失败,并出现
KeyError
。在这种情况下,您可以使用:

sorted(demo, key=lambda x: x.get("id"))
如果您希望将所有没有
id
的条目置于其余条目的上方或下方,您可以选择在
get
中使用默认值。在这种情况下,以下命令将不带
id
的条目发送到底部:

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


也可能发生这样的情况:您有一个
id
12#10
,您不希望它介于
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中,取消了
cmp

from functools import cmp_to_key
sorted(demo, key=cmp_to_key(compare))

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

sorted(demo, key=lambda x: x['id'])
但是,如果列表中至少有一个条目没有
id
键,则该操作将失败,并出现
KeyError
。在这种情况下,您可以使用:

sorted(demo, key=lambda x: x.get("id"))
如果您希望将所有没有
id
的条目置于其余条目的上方或下方,您可以选择在
get
中使用默认值。在这种情况下,以下命令将不带
id
的条目发送到底部:

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


也可能发生这样的情况:您有一个
id
12#10
,您不希望它介于
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中,取消了
cmp

from functools import cmp_to_key
sorted(demo, key=cmp_to_key(compare))

你能解释一下你为什么期待这个结果吗?它似乎没有排序。您的输入数据不是一个列表(缺少
[…]
),并且您没有提到您收到的错误消息(但失败不是错误描述)。你期望的结果毫无意义。你能解释一下为什么你期望这个结果吗?它似乎没有排序。您的输入数据不是一个列表(缺少
[…]
),并且您没有提到您收到的错误消息(但失败不是错误描述)。您的预期输出毫无意义。