Как отсортировать список вложенных словарей на основе глубоко вложенного ключа?

#python #python-3.9

Вопрос:

У меня есть список, который выглядит так:

 ls = [  {  "max_supply": None,  "platform": None,  "quote": {  "USD": {  "fully_diluted_market_cap": 464800388135.72,  "last_updated": "2021-10-20T13:37:02.000Z",  "market_cap": 464800388135.7246,  "price": 3938.871641392752,  "volume_24h": 15411634916.820467,  "volume_change_24h": -3.4909  }  }  },  {  "max_supply": None,  "platform": None,  "quote": {  "USD": {  "fully_diluted_market_cap": 58764548678.52,  "last_updated": "2021-10-20T13:37:03.000Z",  "market_cap": 58764548678.52,  "price": 4784.77,  "volume_24h": 189992412916.647,  "volume_change_24h": 85.422  }  }  }, ]  

Как упорядочить данный список по каждому market_cap значению, расположенному в ключах quote и USD ?

Я нашел некоторые решения, но они относятся только к сортировке по ключам и значениям словаря первого уровня, однако я не смог найти никаких решений для сортировки по ключам и значениям в двухуровневом словаре. в приведенном списке.

Ответ №1:

Вы можете передать лямбда-функцию в качестве key аргумента встроенной sorted функции:

 ls = [  {  "max_supply": None,  "platform": None,  "quote": {  "USD": {  "fully_diluted_market_cap": 464800388135.72,  "last_updated": "2021-10-20T13:37:02.000Z",  "market_cap": 464800388135.7246,  "price": 3938.871641392752,  "volume_24h": 15411634916.820467,  "volume_change_24h": -3.4909  }  }  },  {  "max_supply": None,  "platform": None,  "quote": {  "USD": {  "fully_diluted_market_cap": 58764548678.52,  "last_updated": "2021-10-20T13:37:03.000Z",  "market_cap": 58764548678.52,  "price": 4784.77,  "volume_24h": 189992412916.647,  "volume_change_24h": 85.422  }  }  }, ] sorted_ls = sorted(ls, key=lambda obj: obj["quote"]["USD"]["market_cap"])  

Кроме того, вы можете использовать этот .sort() метод, если хотите отредактировать список на месте.

Комментарии:

1. Спасибо, это сработало! Я просто добавил reverse=True опцию в sorted() метод, и это сработало как заклинание, сортируя от самого высокого к самому низкому.

Ответ №2:

Вы можете определить свою собственную функцию, которая возвращает ключ для сортировки, а затем использовать sort его следующим образом

 all_data = [  {  "max_supply": null,  "platform": null,  "quote": {  "USD": {  "fully_diluted_market_cap": 464800388135.72,  "last_updated": "2021-10-20T13:37:02.000Z",  "market_cap": 464800388135.7246,  "price": 3938.871641392752,  "volume_24h": 15411634916.820467,  "volume_change_24h": -3.4909  }  }  },  {  "max_supply": null,  "platform": null,  "quote": {  "USD": {  "fully_diluted_market_cap": 58764548678.52,  "last_updated": "2021-10-20T13:37:03.000Z",  "market_cap": 58764548678.52,  "price": 4784.77,  "volume_24h": 189992412916.647,  "volume_change_24h": 85.422  }  }  }, ]  def get_sort_key(current_dict):  return current_dict['quote']['USD']['market_cap'] all_data.sort(key=get_sort_key) print(f'Sorted dict: {all_data}')