Сортировать список dict с ключом из другого списка dict - PullRequest
0 голосов
/ 15 марта 2019

В следующем примере я хотел бы отсортировать животных по алфавиту в порядке их категории, который хранится в словаре порядка.

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 ]

3 голосов
/ 15 марта 2019

Вы сортируете по идентификатору категории.Все, что вам нужно сделать, это сопоставить этот идентификатор с поиском для данного category имени.

Сначала создайте словарь для категорий, чтобы вы могли напрямую сопоставить числовой идентификатор с соответствующим именем из 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'}]
0 голосов
/ 15 марта 2019

Imo ваша структура категории слишком сложна - по крайней мере, если 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}]                                                
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...