Сортировка списка словарей по годам жизни
Есть список словарей:
[{"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
→ Ссылка
- Все дело в том, что
.joinработает не так, как вы, видимо, того ожидаете.
'-'.join('123')выдаст не-123, а1-2-3. 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.'}]