Сортировка списка словарей по подстроке в значениях

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

[{"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.'}]
→ Ссылка