如何用Python的正确方法对dictrionaries列表进行排序

2024-10-01 07:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的清单如下:

data = [
  {'items': [
    {'key': u'3', 'id': 1, 'name': u'Typeplaatje'},
    {'key': u'2', 'id': 2, 'name': u'Aanduiding van het chassisnummer '},
    {'key': u'1', 'id': 3, 'name': u'Kilometerteller: Kilometerstand '},
    {'key': u'5', 'id': 4, 'name': u'Inschrijvingsbewijs '},
    {'key': u'4', 'id': 5, 'name': u'COC of gelijkvormigheidsattest '}
  ], 'id': 2, 'key': u'B', 'name': u'Onderdelen'},
  {'items': [
    {'key': u'10', 'id': 10, 'name': u'Koppeling'},
    {'key': u'7', 'id': 11, 'name': u'Differentieel '},
    {'key': u'9', 'id': 12, 'name': u'Cardanhoezen '},
    {'key': u'8', 'id': 13, 'name': u'Uitlaat '},
    {'key': u'6', 'id': 15, 'name': u'Batterij'}
    ], 'id': 2, 'key': u'B', 'name': u'Onderdelen'}
]

我想按keyitems排序。你知道吗

因此,预期结果如下:

res = [
      {'items': [
        {'key': u'1', 'id': 3, 'name': u'Kilometerteller: Kilometerstand '},
        {'key': u'2', 'id': 2, 'name': u'Aanduiding van het chassisnummer '},
        {'key': u'3', 'id': 1, 'name': u'Typeplaatje'},
        {'key': u'4', 'id': 5, 'name': u'COC of gelijkvormigheidsattest '},        
        {'key': u'5', 'id': 4, 'name': u'Inschrijvingsbewijs '},

      ], 'id': 2, 'key': u'B', 'name': u'Onderdelen'},
      {'items': [
        {'key': u'6', 'id': 15, 'name': u'Batterij'},
        {'key': u'7', 'id': 11, 'name': u'Differentieel '},
        {'key': u'8', 'id': 13, 'name': u'Uitlaat '},
        {'key': u'9', 'id': 12, 'name': u'Cardanhoezen '},
        {'key': u'10', 'id': 10, 'name': u'Koppeling'}        
        ], 'id': 2, 'key': u'B', 'name': u'Onderdelen'}
    ]

我试过如下方法:

res = []
for item in data:
  new_data = {
    'id': item['id'],
    'key': item['key'],
    'name': item['name'],
    'items': sorted(item['items'], key=lambda k : k['key']) 
  }
  res.append(new_data)

print(res)

第一个排序很好,但第二个排序不好。你知道吗

我做错了什么?还有更好的方法吗?你知道吗


Tags: keynameiddata排序itemsresitem
3条回答

您需要将data中的旧items替换为基于key而不是字符串排序的sorteditems。所以用int(item['key'])来排序

>>> data
[{'items': [{'key': '1', 'id': 3, 'name': 'Kilometerteller: Kilometerstand '}, {'key': '2', 'id': 2, 'name': 'Aanduiding van het chassisnummer '}, {'key': '3', 'id': 1, 'name': 'Typeplaatje'}, {'key': '4', 'id': 5, 'name': 'COC of gelijkvormigheidsattest '}, {'key': '5', 'id': 4, 'name': 'Inschrijvingsbewijs '}], 'id': 2, 'key': 'B', 'name': 'Onderdelen'}, {'items': [{'key': '6', 'id': 15, 'name': 'Batterij'}, {'key': '7', 'id': 11, 'name': 'Differentieel '}, {'key': '8', 'id': 13, 'name': 'Uitlaat '}, {'key': '9', 'id': 12, 'name': 'Cardanhoezen '}, {'key': '10', 'id': 10, 'name': 'Koppeling'}], 'id': 2, 'key': 'B', 'name': 'Onderdelen'}]
>>>
>>> for item in data:
...   item['items'] = sorted(item['items'], key=lambda x: int(x['key']))
... 
>>> import pprint
>>> pprint.pprint(data)
[{'id': 2,
  'items': [{'id': 3, 'key': '1', 'name': 'Kilometerteller: Kilometerstand '},
            {'id': 2, 'key': '2', 'name': 'Aanduiding van het chassisnummer '},
            {'id': 1, 'key': '3', 'name': 'Typeplaatje'},
            {'id': 5, 'key': '4', 'name': 'COC of gelijkvormigheidsattest '},
            {'id': 4, 'key': '5', 'name': 'Inschrijvingsbewijs '}],
  'key': 'B',
  'name': 'Onderdelen'},
 {'id': 2,
  'items': [{'id': 15, 'key': '6', 'name': 'Batterij'},
            {'id': 11, 'key': '7', 'name': 'Differentieel '},
            {'id': 13, 'key': '8', 'name': 'Uitlaat '},
            {'id': 12, 'key': '9', 'name': 'Cardanhoezen '},
            {'id': 10, 'key': '10', 'name': 'Koppeling'}],
  'key': 'B',
  'name': 'Onderdelen'}]

在第二种情况下,排序是错误的,因为键是字符串,如果键是'10',则字符串按其第一个字符'1'排序。对排序函数稍加修改即可:

'items': sorted(item['items'], key=lambda k : int(k['key'])

我在做一个int,因为你想把它们当作数字来排序。在您的代码中:

res = []
for item in data:
  new_data = {
    'id': item['id'],
    'key': item['key'],
    'name': item['name'],
    'items': sorted(item['items'], key=lambda k : int(k['key']) )
  }
  res.append(new_data)

print(res)

结果如下:

[{'id': 2,
  'items': [{'id': 3, 'key': '1', 'name': 'Kilometerteller: Kilometerstand '},
            {'id': 2, 'key': '2', 'name': 'Aanduiding van het chassisnummer '},
            {'id': 1, 'key': '3', 'name': 'Typeplaatje'},
            {'id': 5, 'key': '4', 'name': 'COC of gelijkvormigheidsattest '},
            {'id': 4, 'key': '5', 'name': 'Inschrijvingsbewijs '}],
  'key': 'B',
  'name': 'Onderdelen'},
 {'id': 2,
  'items': [{'id': 15, 'key': '6', 'name': 'Batterij'},
            {'id': 11, 'key': '7', 'name': 'Differentieel '},
            {'id': 13, 'key': '8', 'name': 'Uitlaat '},
            {'id': 12, 'key': '9', 'name': 'Cardanhoezen '},
            {'id': 10, 'key': '10', 'name': 'Koppeling'}],
  'key': 'B',
  'name': 'Onderdelen'}]

因此list附带了一个名为sort的简便方法,它可以在适当的位置对自身进行排序。我会利用这个优势:

for d in data:
    d['items'].sort(key=lambda x: int(x['key']))

结果:

[{'id': 2,
  'items': [{'id': 3, 'key': '1', 'name': 'Kilometerteller: Kilometerstand '},
            {'id': 2, 'key': '2', 'name': 'Aanduiding van het chassisnummer '},
            {'id': 1, 'key': '3', 'name': 'Typeplaatje'},
            {'id': 5, 'key': '4', 'name': 'COC of gelijkvormigheidsattest '},
            {'id': 4, 'key': '5', 'name': 'Inschrijvingsbewijs '}],
  'key': 'B',
  'name': 'Onderdelen'},
 {'id': 2,
  'items': [{'id': 15, 'key': '6', 'name': 'Batterij'},
            {'id': 11, 'key': '7', 'name': 'Differentieel '},
            {'id': 13, 'key': '8', 'name': 'Uitlaat '},
            {'id': 12, 'key': '9', 'name': 'Cardanhoezen '},
            {'id': 10, 'key': '10', 'name': 'Koppeling'}],
  'key': 'B',
  'name': 'Onderdelen'}]

相关问题 更多 >