В комментариях и другом решении есть хорошее обсуждение сортировки и словарей. ИМХО, опасно думать / предполагать, что словарь или набор отсортированы, потому что по замыслу они не предназначены для упорядочивания. С оговорками в других идеях, вы можете сделать это или переключиться на OrderedDict
, что имеет некоторые накладные расходы. Я предлагаю просто «отсортировать ключи», когда вам нужно. Конечно, если вы обнаружите, что это нужно сделать МНОГО, тогда это будет мотивация переключиться на другую структуру данных.
Вот сокращение с некоторыми другими улучшениями:
- используйте
set
, когда вы собираетесь делать вещи, подобные множеству, такие как пересечение / различие. Это намного чище - Не используйте верхний регистр для имен переменных ... python стандартный - нижний регистр
- вы почти наверняка захотите
strip()
вводить / завершать пробелы из записей, поэтому вы не зацикливаетесь на разнице между:
Cat in Hat: Bob
Cat in Hat:Bob
# sorting books
books = {} # title : set of readers
all_names = set() # all reader names set
line = input('Enter book title : name ')
while line:
book, name = [t.strip() for t in line.split(':')] # strip out pesky leading/trailing spaces.
if book not in books:
# add it to our dictionary as a list with one element
books[book] = {name, } # a set with one item
else:
books[book].add(name)
all_names.add(name) # set will not accept duplicates, so this works...
line = input('Enter book title : name ')
# now we have a dictionary of book : set of names that have read it
# and a set of all names that we can use
for k in sorted(books): # sort the keys only when needed
non_readers = all_names ^ books[k]
# note: ^ is symmetric difference, so result will be names in all_names that are not in readers
if non_readers: # non-empty response
print(f'{k} has not been read by: {", ".join(sorted(non_readers))}')
else:
print(f'Everyone has read {k}')
Повозившись с этим, я понимаю, что вы, вероятно, не ведете книжный клуб, и это, вероятно, задание H / W, так что теперь я чувствую себя плохо из-за этого ... lol.