Сортировать список списков, содержащих словари в Python - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь реализовать генетические алгоритмы для оптимизации путей.Для этого мне нужно отсортировать списки.

Основной список (list_cities) выглядит так:

[[{'city': 'Pau', 'lan': 43.293295, 'lng': -0.36357}, {'city': 'Marseille', 'lan': 43.293551, 'lng': 5.377397}, {'distance': 5572.500801706894}], [{'city': 'Nice', 'lan': 43.70168, 'lng': 7.260711}, {'city': 'Lyon', 'lan': 45.759132, 'lng': 4.834604}, {'distance': 6306.2650380290725}]]

Как видите, у меня есть глобальный список, содержащий несколько списков (200) содержащие сами города и расстояние (представляющее общее расстояние, чтобы связать все города в порядке списка. Я хотел бы отсортировать мои 200 списков городов по последнему значению, которое является расстоянием. Я пробовал во многих отношениях, но безsuccess.

Моя последняя попытка:

sort_list = sorted(list_cities, key=lambda k: k['distance'])

, которая дает мне следующий результат:

TypeError: индексы списка должны быть целыми или кусочками, а не str

1 Ответ

0 голосов
/ 08 мая 2019

[[{},{}],[{},{}]] - это список списков, содержащих объекты dicts (которые я продолжаю называть объектами до конца этого ответа, потому что данные все равно поступают из JSON).Таким образом, чтобы отсортировать списки по числу, содержащемуся во внутреннем объекте, вы должны найти данный объект в списке, а затем получить из него номер.
Как видно из примера и вашего комментария, расстояние составляетвсегда в последнем элементе, к которому вы можете получить доступ через индекс -1, и, таким образом,

sort_list = sorted(list_cities, key=lambda k: k[-1]['distance'])

может работать.

По поводу другого вопроса: я бы посчитал более естественным указывать только городав списке объекта:

[
 {
  'cities':[
   {'city':'Pau','lat':...,'lon':...},
   {<2nd city>},
   ...
   {<last city>}
  ],
  'distance':...
 },
 ...
]

тогда он будет работать с исходной попыткой.
(Извините за неуклюжий пример, я набираю его на сенсорном экране, э-э)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...