сортировать по значениям в словаре, когда это дата - PullRequest
0 голосов
/ 04 декабря 2018

Я новичок в Python и столкнулся с проблемой во время практики.Пользователь сначала введет количество людей.Затем он / она введет имя, а затем день рождения.

Например, если вначале введите 3, а затем John, то 1/1 3 означает, что пользователь введет день рождения 3 человек, а также Имя идата (формат: день / месяц) Затем меня просят отсортировать дату их рождения в порядке возрастания.

Например, если введены значения 3 John 12/6 Betty 1/5Mike 16/1 будет выводиться

Mike 16/1
Betty 1/5
John 12/6

Вот что у меня было на руке, и я могу думать только о сжатии двух списков в словарь.Тогда я не знаю, как перейти к следующему шагу.

number = int(input())
a=[]
b=[]
for i in range(number):
    m = input()
    a.append(m)
    n = input()
    b.append(n)        

dictionary = dict(zip(a,b))

print(dictionary)

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Я предлагаю вам сохранить даты как datetime переменные, возможно, так:

number = int(input())
people_list = []
for _ in range(number):
    name = input()
    day, month = input().split('/')
    year = 2018  # a default year same for all if you won't prompt for the correct year

    people_list.append({
        'name': name,
        'birthday': datetime.date(year, month, day),
    })

people_list = list(sorted(
    people_list,
    key=lambda x: x['birthday']))

Затем вы можете отсортировать список с помощью sorted() и выбрать сортировку по birthday.

0 голосов
/ 04 декабря 2018

Мы можем хранить имена и дни рождения в кортежах.Затем, чтобы отсортировать их, мы конвертируем дату в datetime.date в 2000 году. Это високосный год, поэтому 29 февраля будет действительным!

from datetime import date

number = int(input("Number of birthdays:"))
bdays = []

for i in range(number):
    name = input("Enter name:")
    birthday = input("Birthday:")
    bdays.append((name, birthday))        


def birthday_as_date(birthday):
    "birthday is a string day/month. Returns this date in year 2000"
    day, month = map(int, birthday.split('/'))
    return date(2000, month, day)  # 2000 is a leap year, so 29/02 is allowed!

bdays.sort(key = lambda bday: birthday_as_date(bday[1]))


print(bdays)

Пример прогона:

# Number of birthdays:3
# Enter name:Mike
# Birthday:29/2
# Enter name:John
# Birthday:4/5
# Enter name:Homer
# Birthday:2/1
# [('Homer', '2/1'), ('Mike', '29/2'), ('John', '4/5')]
0 голосов
/ 04 декабря 2018

Вы можете использовать sorted с пользовательской функцией, за которой следует цикл for:

def sort_key(x):
    return list(map(int, x[1].split('/')))[::-1]

res = sorted(dictionary.items(), key=sort_key)

for name, date in res:
    print(name, date)

Mike 16/1
Betty 1/5
John 12/6

Критическим битом является функция sort_key, которая разделяется на '/', преобразует строкив целые числа и переворачивает список, чтобы месяц имел приоритет над днем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...