Сортировка списка словарей по подстроке в значениях
Есть список словарей:
[{"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."}]
Необходимо написать функцию для сортировки этого списка по дате смерти. Если ВС - это до нашей эры
Ответы (3 шт):
Автор решения: Zhihar
→ Ссылка
data = [{"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."}]
# рассчитать год
for record in data:
# распарсить дату
dates = (''.join(record['years'].split())).split("–")
# получить дату сперти
death = int(dates[1].replace(".", "").replace("c", "").replace("BC", ""))
death = death * -1 if dates[1].find("BC") != -1 else death
# записать дату в массив
record["death"] = death
# отсортировать массив
print(*data, sep="\n", end="\n\n")
print()
data.sort(key=lambda record: record["death"])
print(*data, sep="\n")
Автор решения: Danis
→ Ссылка
def key(dict_):
year = dict_["years"].split("–")[1]
if len(year.split()) == 1:
return int(year.split()[0][:-1])
return -int(year.split(" ")[-2])
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."}]
list_.sort(key = key)
print(*list_, sep = "\n")
Автор решения: strawdog
→ Ссылка
import re
lst = [{"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 d_retr(a: str)-> int:
year = re.match(".+\s(\d+)\D*$", a).group(1)
year = -int(year) if ("bc" in a.lower()) else int(year)
return year
res = sorted(lst, key=lambda x:d_retr(x["years"]))
res:
[{'name': 'Euclid', 'years': 'c. 325 – c. 270 BC.'},
{'name': 'Archimedes', 'years': 'c. 287 BC – 212 BC.'},
{'name': 'Brahmagupta', 'years': '597 – 668.'},
{'name': 'Rene Descartes', 'years': '1596 – 1650.'},
{'name': 'Daniel Bernoulli', 'years': '1700 – 1782.'}]