Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以正确的方式对dictrionaries列表进行排序_Python - Fatal编程技术网

Python 如何以正确的方式对dictrionaries列表进行排序

Python 如何以正确的方式对dictrionaries列表进行排序,python,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', 'i

我的名单如下:

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'}
]
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)
我想按
键对
项进行排序

因此,预期结果如下:

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'}
]
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)
我试过如下方法:

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'}
]
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)
第一个排序很好,但第二个排序不好


我做错了什么?有更好的方法吗?

您需要将
数据中的
替换为基于
排序的
,而不是字符串排序。因此,使用
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'}]

您需要将
数据
中的旧
替换为基于
排序
,而不是字符串排序。因此,使用
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'}]

在第二种情况下,排序错误,因为键是字符串,如果键是
'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'}]

因此,
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'}]

为什么
10
要排在
B
之前?@DanielRoseman-
B
不包括在
项目中
,这是
项目的
parent@DanielRoseman我认为,用户希望
按数字顺序排序。所以
int(item['key'])
,我想为什么
10
应该排在
B
之前?@DanielRoseman-
B
不包括在
items
中,这是
项的
键parent@DanielRoseman我认为,用户希望
按数字顺序排序。所以我猜
int(item['key'])