Я могу перебрать меньший словарь, но получить TypeError для большей версии словаря - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть задание провести инвентаризацию личных книг, мой лектор посоветовал мне использовать словарь. У меня есть два словаря с одинаковой структурой, но в одном есть все книги из этого (mainLib в коде) а другой - инвентарь, к которому пользователь добавляет (myLib). Я использовал original_title в качестве ключей для словаря.

Проблема в том, что этот код работает для сортировки названий книг по алфавиту в myLib, но когда я пытаюсь использовать более крупный словарь, mainLib, я получаю TypeError: '<' not supported between instances of 'float' and 'str'. Я хочу отобразить все названия книг (ключи) в mainLib {} в алфавитном порядке в виджете «Вывод».

for b_ti, b_info in sorted(myLib.items()):
    print(b_ti, " By ", b_info['authors'])  

Это код, который я использовал для извлечения и записи данных в mainLib.

#col_list is used to select specific columns from the csv
col_list=["authors", "original_publication_year", "original_title", "image_url", "small_image_url"] 
#the selected columns are mapped to data frame
df = pd.read_csv(r"books2.csv", usecols=col_list)

mainLib={} #books in the main library
myLib ={}  #books in your personal inventory
#set it so that the keys in dictionary are book titles
mainLib=df.set_index('original_title').T.to_dict()

Этот код используется для добавления книг в myLib {}, возможно, он влияет на то, почему я могу отсортировать myLib {}. Книга - это название книги в mainLib {}.

#function to add book to your inventory
def addMyList(book):
    mlsearch = book
    val= mainLib.get(mlsearch)
    keyslist= [key for(key,value) in mainLib.items() if value == val]
    mykeys = keyslist[0]
    myLib.update({ mykeys : val})

Вот как выглядят словари, я использовал myLib {}, так как он меньше. словарь myLib

Словарь myLib содержит только 5 книг, поэтому можно использовать сортировку? Есть ли другой способ сортировки по mainLib {} или это ограничение словарей?

Кроме того, если что-то выглядит не так, то это потому, что я новичок в python.
Спасибо

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если вам не нужно использовать dict, проще использовать фрейм данных для сортировки:

#col_list is used to select specific columns from the csv
col_list=["authors", "original_publication_year", "original_title", "image_url", "small_image_url"] 
#the selected columns are mapped to data frame
df = pd.read_csv("books.csv", usecols=col_list)
df = df.sort_values(by=['original_title'])
print(df['original_title'] + " By " + df['authors'])  

output:

18         The Fellowship of the Ring By J.R.R. Tolkien
38              A Game of Thrones By George R.R. Martin
82    A Tale of Two Cities By Charles Dickens, Richa...
66          A Thousand Splendid Suns By Khaled Hosseini
85                       A Time to Kill By John Grisham
                            ...                        
45                    Water for Elephants By Sara Gruen
49    Where the Sidewalk Ends: The Poems and Drawing...
62    Wuthering Heights By Emily Brontë, Richard J. ...
78    Ὀδύσσεια By Homer, Robert Fagles, E.V. Rieu, F...
74                                                  NaN

Обратите внимание, что первый элемент начинается с пробел (именно поэтому он сортируется первым), и у вас есть NaN в ваших предметах. А если вам нужно отсортировать по разным столбцам, просто добавьте их к аргументу by в сортировке.

ОБНОВЛЕНИЕ:

Если вам нужно удалить заголовки из пробелов, вы можете использовать:

df['original_title']=df['original_title'].str.strip()

А если вы хотите сбросить NaN:

df.dropna(axis=0, inplace=True)

Выводится и NaN удаляется:

38              A Game of Thrones By George R.R. Martin
82    A Tale of Two Cities By Charles Dickens, Richa...
66          A Thousand Splendid Suns By Khaled Hosseini
85                       A Time to Kill By John Grisham
28    An Excellent conceited Tragedie of Romeo and J...
                            ...                        
86    Un di Velt Hot Geshvign By Elie Wiesel, Marion...
45                    Water for Elephants By Sara Gruen
49    Where the Sidewalk Ends: The Poems and Drawing...
62    Wuthering Heights By Emily Brontë, Richard J. ...
78    Ὀδύσσεια By Homer, Robert Fagles, E.V. Rieu, F...
1 голос
/ 17 апреля 2020

Ключи словаря не все одного типа, в этом случае лучше всего установить строковое значение, например:

sample_dict = {'C': 1, 'A':2, 'B': 3}
sorted(sample_dict.items()) # this works [('A', 2), ('B', 3), ('C', 1)]

Следующее не получится, поскольку существует целочисленный ключ:

sample_dict = {'C': 1, 1:2, 'B': 3}
sorted(sample_dict.items()) # TypeError

Ключи нельзя изменить, вам придется создать новый словарь:

sample_dict = {'C': 1, 1:2, 'B': 3}
sample_dict_fixed = {str(x): y for x,y in sample_dict.items()}
sorted(sample_dict_fixed.items()) # this works [('1', 2), ('B', 3), ('C', 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...