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