Как отсортировать словарь и установить его по алфавиту? - PullRequest
0 голосов
/ 06 августа 2020

Я создал этот код, чтобы показать, какие книги люди не читали в книжном клубе.

Написанный мной код:

Books = {}
Names = []
temp1 = set()
line = input('Book read: ')
while line:
  Book, Name = line.split(':')
  if Book not in Books:
    # add it to our dictionary as a list with one element
    Books[Book] = [Name]
  else:
    Books[Book].append(Name)
  line = input('Book read: ')
  
  if Name not in Names :
    Names.append(Name)
    
Names = list(dict.fromkeys(Names))

for Name in Names:
  temp1.add(Name)
  
BookSorted = dict(sorted(Books.items()))

for Book in BookSorted:
  if BookSorted[Book] == Names :
    print(Book + ": Everyone has read this!")
  else:
    temp2 = set(BookSorted[Book])
    print(Book, ':', ', '.join(temp1 - temp2))

Он работает, но оба список книг и названия не располагаются в алфавитном порядке. (Я удалил свои различные попытки, чтобы вам было легче читать).

В следующем тестовом образце

Book read: Pride and Prejudice:Jenny
Book read: A Tale of Two Cities:Mark
Book read: Magician:Jenny
Book read: The Lord of the Rings:Pavel
Book read: Magician:Pavel

Мой код возвращает

Pride and Prejudice: Mark, Pavel
A Tale of Two Cities: Pavel, Jenny
Magician: Mark
The Lord of the Rings: Mark, Jenny

Когда он должен вернуть

A Tale of Two Cities: Jenny, Pavel
Magician: Mark
Pride and Prejudice: Mark, Pavel
The Lord of the Rings: Jenny, Mark

Любая помощь будет принята с благодарностью :)

С наилучшими пожеланиями

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

В комментариях и другом решении есть хорошее обсуждение сортировки и словарей. ИМХО, опасно думать / предполагать, что словарь или набор отсортированы, потому что по замыслу они не предназначены для упорядочивания. С оговорками в других идеях, вы можете сделать это или переключиться на 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.

0 голосов
/ 06 августа 2020

Задавая диктант с названиями книг в качестве ключей и читателей в качестве значений, вы можете сделать что-то вроде этого:

data = {
    "Pride and Prejudice": ["Mark", "Pavel"],
    "A Tale of Two Cities": ["Pavel", "Jenny"],
    "Magician": ["Mark"],
    "The Lord of the Rings": ["Mark", "Jenny"]
}

data = dict(sorted(data.items()))


# just a short print loop to show you the order

for k,v in data.items():
    print(k+":"+str(v))

#A Tale of Two Cities:['Pavel', 'Jenny']
#Magician:['Mark']
#Pride and Prejudice:['Mark', 'Pavel']
#The Lord of the Rings:['Mark', 'Jenny']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...