Сортировка списка словарей по годам жизни

Есть список словарей:

[{"name": "Archimedes",
     "years": "c. 287 BC – 212 BC."},
    {"name": "Daniel Bernoulli",
     "years": "1700 – 1782."},
    {"name": "Brahmagupta",
     "years": "597 – 668.",},
    {"name": "Rene Descartes",
     "years": "1596 – 1650."},
    {"name": "Euclid",
     "years": "c. 325 – c. 270 BC."}]

Необходимо написать функцию для сортировки этого списка по году смерти. Если ВС - это до нашей эры

Я написал следующее:

def key_sorted_by_data(obj_dict):
    years = re.findall(r'[0-9]+', obj_dict["years"])
    death_y = years[-1]
    years = "-".join(death_y) if "BC" in obj_dict["years"] else years
    d_data = years[-1]
    return int(d_data)

new_dict_list = sorted(dict_list, key=key_sorted_by_data)

Вот только выводит Архимеда на 1 место. В чем моя ошибка?


Ответы (2 шт):

Автор решения: n1tr0xs
  1. Все дело в том, что .join работает не так, как вы, видимо, того ожидаете.
    '-'.join('123') выдаст не -123, а 1-2-3.
  2. data - данные, date - дата, но это так, придирки к переводу.

Предлагаю вам такое решение:

def key_sort_by_date(obj):
    obj_year = obj['years']
    year = re.findall(r'\d+', obj_year)[-1]
    return -int(year) if 'BC' in obj_year[obj_year.index(year):] else int(year)
→ Ссылка
Автор решения: Daniil Loban

Небольшая математическая хитрость - годы смерти BC со знаком минус

import re

dict_list = [{"name": "Archimedes",
     "years": "c. 287 BC – 212 BC."},
    {"name": "Daniel Bernoulli",
     "years": "1700 – 1782."},
    {"name": "Brahmagupta",
     "years": "597 – 668.",},
    {"name": "Rene Descartes",
     "years": "1596 – 1650."},
    {"name": "Euclid",
     "years": "c. 325 – c. 270 BC."}]

def key_sorted_by_data(obj_dict):
    years = re.findall(r'[0-9]+', obj_dict["years"])
    return int(years[-1]) if "BC" in obj_dict["years"] else -int(years[-1])

new_dict_list = sorted(dict_list, key=key_sorted_by_data)

print(new_dict_list)


[{'name': 'Daniel Bernoulli', 'years': '1700 – 1782.'},
 {'name': 'Rene Descartes', 'years': '1596 – 1650.'}, 
 {'name': 'Brahmagupta', 'years': '597 – 668.'}, 
 {'name': 'Archimedes', 'years': 'c. 287 BC – 212 BC.'},
 {'name': 'Euclid', 'years': 'c. 325 – c. 270 BC.'}]
→ Ссылка