#python #python-3.x #dictionary
#python #python-3.x #словарь
Вопрос:
у меня есть два словаря, но разной длины. я хочу сделать длину большего словаря такой же, как у маленького. я использую это, но это выдает ошибку, я думаю, потому что я не могу сделать это с таким словарем. это выдает мне эту ошибку: TypeError: нехешируемый тип: ‘slice’
if len(ints2answers) > len(ints2questions):
ints2answers = ints2answers[:len(ints2questions)]
elif len(ints2questions) > len(ints2answers):
ints2questions = ints2questions[:len(ints2answers)]
Комментарии:
1. Вы можете уменьшить размер второго словаря, удалив некоторые элементы. Но знаете ли вы, какие элементы удалять?
2. ДА. я хочу удалить элементы из последнего индекса меньшего словаря до конца, поскольку они отсортированы.
3. Они отсортированы? Означает ли это, что они
OrderedDict
s ?4. Еще раз, словари не отсортированы. Пожалуйста, добавьте примеры ваших словарей.
5. Это звучит плохо. Еще раз, пожалуйста, покажите нам ваши словари.
Ответ №1:
Как уже указывалось, структура данных словаря не обеспечивает нарезку. Но вы можете вырезать items
из словаря и преобразовать его обратно в словарь.
>>> d = {0:0, 1:1, 2:2, 3:3}
>>> max_len = 2
>>> dict(list(d.items())[:max_len])
{0: 0, 1: 1}
Ответ №2:
Вы получаете ошибку типа, которая означает, что вы выполняете неподдерживаемую операцию для словарей.
Словари представляют собой неупорядоченные списки. Это означает, что у них нет порядка. Вы не можете сказать, какой объект является первым объектом словаря, вместо этого это набор keys
и values
.Но нарезка ( ints2answers[:len(ints2questions)]
) может быть выполнена только с упорядоченным списком (т.е. lists
, tuples
, strings
).
Если вы хотите выполнить описанную выше операцию со своими данными, вы должны сделать это 2D-списком. Это можно сделать очень легко с помощью следующего кода (или вы можете найти свой собственный способ)
myList = [ [k,v] for k, v in myDict.items() ]
Теперь вы можете нарезать свой список и выполнить описанную выше операцию. Если вам нужно снова сделать его словарем, dict(myList)
выполнит эту работу.