作為我專案的一部分,我想創建一個資料庫,根據他們的出生日期對年齡進行排序。
import datetime
profile = (
('Joe', 'Clark', '1989-11-20'),
('Charlie', 'Babbitt', '1988-11-20'),
('Frank', 'Abagnale', '2002-11-20'),
('Bill', 'Clark', '2009-11-20'),
('Alan', 'Clark', '1925-11-20'),
)
age_list = []
for prof in profile:
date = prof[2]
datem = datetime.datetime.strptime(date, "%Y-%m-%d")
tod = datem.day
mos = datem.month
yr = datem.year
today_date = datetime.datetime.now()
dob = datetime.datetime(yr, mos, tod)
time_diff = today_date - dob
Age = time_diff.days // 365
age_list.append(Age)
def insertionsort(age_list):
for him in range(1, len(age_list)):
call = him - 1
while age_list[call] > age_list[call 1] and call >= 0:
age_list[call], age_list[call 1] = age_list[call 1], age_list[call]
call -= 1
print("")
print("\t\t\t\t\t\t\t\t\t\t\t---Insertion Sort---")
print("Sorted Array of Age: ", age_list)
輸出將是:
---Insertion Sort---
Sorted Array of Age: [12, 19, 32, 33, 96]
但這不是我想要的,我不僅要年齡,還要在輸出中包含其他元素
所以我想要的不是之前的輸出,而是:
---Insertion Sort---
Sorted Array of Age: [Bill, Clark, 12]
[Frank, Abagnale, 19]
[Joe, Clark, 32]
[Charlie, Babbitt, 33]
[Alan, Clark, 96]
先謝謝了!
uj5u.com熱心網友回復:
由于您想保留自己的插入排序實作,我建議將出生日期作為第一個元組成員:這樣您就可以在排序實作中比較元組。出生日期實際上是比年齡更適合排序(但相反)的值,因為與年齡(年)相比,日期(日)具有更高的精度。
其次,您計算年齡的演算法很容易出錯,因為并非所有年份都有 365 天。使用此問題中提供的代碼:
import datetime
def calculate_age(born):
today = datetime.date.today()
return today.year - born.year - ((today.month, today.day) < (born.month, born.day))
def insertionsort(lst):
for i, value in enumerate(lst):
for j in range(i - 1, -1, -1):
if lst[j] > value: # this will give a sort in descending order
break
lst[j], lst[j 1] = lst[j 1], lst[j]
# Your example data as a list
profiles = [
('Joe', 'Clark', '1989-11-20'),
('Charlie', 'Babbitt', '1988-11-20'),
('Frank', 'Abagnale', '2002-11-20'),
('Bill', 'Clark', '2009-11-20'),
('Alan', 'Clark', '1925-11-20'),
]
# Put date of birth first, and append age
profiles = [(dob, first, last, calculate_age(datetime.datetime.strptime(dob, "%Y-%m-%d")))
for first, last, dob in profiles]
insertionsort(profiles)
print(profiles)
uj5u.com熱心網友回復:
results = sorted(profile, key = lamda x: datetime.datetime.strptime(x[2], "%Y-%m-%d"))
uj5u.com熱心網友回復:
你可以這樣做。請注意,您可能不需要 strptime 函式,但它會隱式驗證輸入資料中的日期格式。另請注意,由于日期采用 YYYY-MM-DD 的形式,因此可以按詞法對它們進行排序以提供所需的結果。
from datetime import datetime
from dateutil.relativedelta import relativedelta
profile = (
('Joe', 'Clark', '1989-11-20'),
('Charlie', 'Babbitt', '1988-11-20'),
('Frank', 'Abagnale', '2002-11-20'),
('Bill', 'Clark', '2009-11-20'),
('Alan', 'Clark', '1925-11-20')
)
for person in sorted(profile, key=lambda e: e[2], reverse=True):
age = relativedelta(datetime.today(), datetime.strptime(person[2], '%Y-%m-%d')).years
print(f'{person[0]}, {person[1]}, {age}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376012.html
