用另一个字典列表中的键对字典列表进行排序

时间:2019-03-15 15:16:28

标签: python sorting dictionary

在下面的示例中,我想按动物类别的字母顺序对动物进行排序,这些字母存储在字典中。

category = [{'uid': 0, 'name': 'mammals'},
            {'uid': 1, 'name': 'birds'},
            {'uid': 2, 'name': 'fish'},
            {'uid': 3, 'name': 'reptiles'},
            {'uid': 4, 'name': 'invertebrates'},
            {'uid': 5, 'name': 'amphibians'}]

animals = [{'name': 'horse', 'category': 0},
           {'name': 'whale', 'category': 2},
           {'name': 'mollusk', 'category': 4},
           {'name': 'tuna ', 'category': 2},
           {'name': 'worms', 'category': 4},
           {'name': 'frog', 'category': 5},
           {'name': 'dog', 'category': 0},
           {'name': 'salamander', 'category': 5},
           {'name': 'horse', 'category': 0},
           {'name': 'octopus', 'category': 4},
           {'name': 'alligator', 'category': 3},
           {'name': 'monkey', 'category': 0},
           {'name': 'kangaroos', 'category': 0},
           {'name': 'salmon', 'category': 2}]

sorted_animals = sorted(animals, key=lambda k: (k['category'])

我该如何实现? 谢谢。

2 个答案:

答案 0 :(得分:3)

您现在正在按类别ID进行排序。您所需要做的就是将该ID映射到给定category名称的查找。

首先为类别创建字典,以便您可以直接将数字ID映射到category列表中的关联名称,然后在排序时使用该映射:

catuid_to_name = {c['uid']: c['name'] for c in category}

sorted_animals = sorted(animals, key=lambda k: catuid_to_name[k['category']])

演示:

>>> from pprint import pprint
>>> category = [{'uid': 0, 'name': 'mammals'},
...             {'uid': 1, 'name': 'birds'},
...             {'uid': 2, 'name': 'fish'},
...             {'uid': 3, 'name': 'reptiles'},
...             {'uid': 4, 'name': 'invertebrates'},
...             {'uid': 5, 'name': 'amphibians'}]
>>> animals = [{'name': 'horse', 'category': 0},
...            {'name': 'whale', 'category': 2},
...            {'name': 'mollusk', 'category': 4},
...            {'name': 'tuna ', 'category': 2},
...            {'name': 'worms', 'category': 4},
...            {'name': 'frog', 'category': 5},
...            {'name': 'dog', 'category': 0},
...            {'name': 'salamander', 'category': 5},
...            {'name': 'horse', 'category': 0},
...            {'name': 'octopus', 'category': 4},
...            {'name': 'alligator', 'category': 3},
...            {'name': 'monkey', 'category': 0},
...            {'name': 'kangaroos', 'category': 0},
...            {'name': 'salmon', 'category': 2}]
>>> catuid_to_name = {c['uid']: c['name'] for c in category}
>>> pprint(catuid_to_name)
{0: 'mammals',
 1: 'birds',
 2: 'fish',
 3: 'reptiles',
 4: 'invertebrates',
 5: 'amphibians'}
>>> sorted_animals = sorted(animals, key=lambda k: catuid_to_name[k['category']])
>>> pprint(sorted_animals)
[{'category': 5, 'name': 'frog'},
 {'category': 5, 'name': 'salamander'},
 {'category': 2, 'name': 'whale'},
 {'category': 2, 'name': 'tuna '},
 {'category': 2, 'name': 'salmon'},
 {'category': 4, 'name': 'mollusk'},
 {'category': 4, 'name': 'worms'},
 {'category': 4, 'name': 'octopus'},
 {'category': 0, 'name': 'horse'},
 {'category': 0, 'name': 'dog'},
 {'category': 0, 'name': 'horse'},
 {'category': 0, 'name': 'monkey'},
 {'category': 0, 'name': 'kangaroos'},
 {'category': 3, 'name': 'alligator'}]

请注意,在每个类别中,字典按照相对输入顺序保留。您可以从排序键返回一个元组值,以进一步在每个类别中应用排序顺序,例如:

sorted_animals = sorted(
    animals,
    key=lambda k: (catuid_to_name[k['category']], k['name'])
)

将在每个类别中按动物名排序,产生:

>>> pprint(sorted(animals, key=lambda k: (catuid_to_name[k['category']], k['name'])))
[{'category': 5, 'name': 'frog'},
 {'category': 5, 'name': 'salamander'},
 {'category': 2, 'name': 'salmon'},
 {'category': 2, 'name': 'tuna '},
 {'category': 2, 'name': 'whale'},
 {'category': 4, 'name': 'mollusk'},
 {'category': 4, 'name': 'octopus'},
 {'category': 4, 'name': 'worms'},
 {'category': 0, 'name': 'dog'},
 {'category': 0, 'name': 'horse'},
 {'category': 0, 'name': 'horse'},
 {'category': 0, 'name': 'kangaroos'},
 {'category': 0, 'name': 'monkey'},
 {'category': 3, 'name': 'alligator'}]

答案 1 :(得分:0)

您的类别结构太复杂了-至少只要uid除了索引之外什么都没有,您可以简单地使用一个列表:

category = [c['name'] for c in category]
# ['mammals', 'birds', 'fish', 'reptiles', 'invertebrates', 'amphibians']

sorted_animals = sorted(animals, key=lambda k: category[k['category']])

#[{'name': 'frog', 'category': 5}, {'name': 'salamander', 'category': 5}, {'name': 'whale', 'category': 2}, {'name': 'tuna ', 'category': 2}, {'name': 'salmon', 'category': 2}, {'name': 'mollusk', 'category': 4}, {'name': 'worms', 'category': 4}, {'name': 'octopus', 'category': 4}, {'name': 'horse', 'category': 0}, {'name': 'dog', 'category': 0}, {'name': 'horse', 'category': 0}, {'name': 'monkey', 'category': 0}, {'name': 'kangaroos', 'category': 0}, {'name': 'alligator', 'category': 3}]