我有一个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'}
答案 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#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
或者在Python 3中,sorted(demo, cmp=compare)
已被淘汰:
cmp