Как отобразить ключ и обновленные значения вместе, полученные из словаря? - PullRequest
0 голосов
/ 22 мая 2019

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

(сортировка ключей по алфавиту):

dangerous : ['hazardous', 'perilous', 'uncertain'] 
show : ['communicate', 'manifest', 'disclose']
slow : ['leisurely', 'unhurried']
word_dict = {'show': ['display', 'exhibit', 'convey', 'communicate', 'manifest', 'disclose'],
             'slow': ['unhurried', 'gradual', 'leisurely', 'late', 'behind', 'tedious', 'slack'],
             'dangerous': ['perilous', 'hazardous', 'uncertain']}

def main():
    edited_synonyms = remove_word(word_dict)
    key_order(edited_synonyms)

def remove_word(word_dict):
    dictionary = {}

    synonyms_list = word_dict.values()
    new_list = []
    for i in synonyms_list:
        new_list.extend(i)

    for word in new_list:
        letter_length = len(word)
        if letter_length <= 7:
            new_list.pop(new_list.index(word))

    value = new_list 
    keys_only = word_dict.keys()
    key = keys_only
    dictionary[key] = value
    return dictionary


def key_order(word_dict):
    word_list = list(word_dict.keys())
    word_list.sort()
    for letter in word_list:
        value = word_list[letter]
        print(letter, ": ", value)

main()

Ошибка, возникшая до сих пор: "TypeError: unhashable type: 'dict_keys'«

Ответы [ 3 ]

1 голос
/ 22 мая 2019
word_dict = {'show': ['display', 'exhibit', 'convey', 'communicate', 'manifest', 'disclose'],
             'slow': ['unhurried', 'gradual', 'leisurely', 'late', 'behind', 'tedious', 'slack'],
             'dangerous': ['perilous', 'hazardous', 'uncertain']}

result = {i:list(filter(lambda x: len(x)>7, word_dict[i])) for i in word_dict }

key_sorted =sorted(result.keys(), key=lambda x:x.lower())
# sorting alphabetically
solution = {i:result[i] for i in key_sorted}

print(solution)

output

{'dangerous': ['perilous', 'hazardous', 'uncertain'], 
 'show': ['communicate', 'manifest', 'disclose'],
 'slow': ['unhurried', 'leisurely']
 }
1 голос
/ 22 мая 2019
    value = new_list 
    keys_only = word_dict.keys()
    key = keys_only
    dictionary[key] = value

Это код, который вызывает ошибку.key - это не один ключ, это объект типа dict_keys (возвращается word.dict.keys()).Такой объект не может быть одним ключом, потому что в словарях используются хэш-карты, и, как сказано в сообщении об ошибке, dict_keys не подлежит обработке.

Самое простое решение (сохранение кода) - поместить всю вашу функцию в цикл, повторяющийся посначала ключи, чтобы на каждой итерации вы имели дело только с одной словарной записью.

1 голос
/ 22 мая 2019

Ваша проблема может быть решена с помощью одной строки:

waka_dict = {key: [w for w in word_dict[key] if len(w) > 7] for key in word_dict}

Будет возвращено необходимое значение:

{'dangerous': ['perilous', 'hazardous', 'uncertain'],
 'show': ['communicate', 'manifest', 'disclose'],
 'slow': ['unhurried', 'leisurely']}

(сохранит исходный порядок списков)


Если вы хотите, чтобы ваш приказ велел, вы должны иметь в виду, что диктанты Python не заказаны. Вы должны использовать для этого collection.OrderedDict :

from collections import OrderedDict

ordered_dict = OrderedDict(sorted(waka_dict.items()))
...