Python: как удалить элементы из словаря и вернуть его в виде списка?

Я пытался выполнить упражнение, которое требует от меня удаления слов в словаре, содержащем слова длиной 7 или менее символов. До сих пор я пытался использовать метод .values(), чтобы получить только слова в квадратных скобках и, таким образом, создать список для хранения этих слов. Однако у меня возникла проблема с использованием метода pop, когда я получаю

"TypeError: 'str' object cannot be interpreted as an integer".

Вот мой код:

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

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

def remove_word(word_dict):
    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(word)

    return new_list

main()
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
134
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

list.pop принимает в качестве аргумента индекс элемента, который вы хотите удалить из списка, но когда вы делаете new_list.pop(word), вы фактически предоставляете сам элемент, отсюда и ошибка.

Из документов: https://docs.python.org/3/tutorial/datastructures.html

list.pop([i])
Remove the item at the given position in the list, and return it. You can easily solve this using dictionary comprehension, where you only include values in your list, with length > 7

Чтобы это исправить, просто найдите индекс слова, которое вы хотите вывести, с помощью list.remove().

Итак, линия

 new_list.pop(word)

изменится на

 new_list.remove(word)

Но лучшим подходом может быть использование понимания списка, например

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

#Iterate through the values of the list and pick one with length > 7
res = [v for value in word_dict.values() for v in value if len(v) > 7  ]
print(res)

Результат будет

['communicate', 'manifest', 'disclose', 'unhurried', 'leisurely']
Ответ принят как подходящий

Ваша программа правильная. Любыми способами, которые вам нужны, чтобы добавить значение index в pop.

Модифицированный код:

>>> def remove_word(word_dict):
    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)) # Modified line

    return new_list

Выход:

>>> main()
['exhibit', 'communicate', 'manifest', 'disclose', 'unhurried', 'leisurely', 'behind', 'slack']

Попробуй это :

outp = {k: [v for v in word_dict[k] if len(v)<=7 ]for k in word_dict}

Выход :

{'show': ['communicate', 'manifest', 'disclose'], 'slow': ['unhurried', 'leisurely']}

На list вы можете выталкивать элементы на основе индекса.

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

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

def remove_word(word_dict):
    synonyms_list = word_dict.values()
    new_list = list()
    for i in synonyms_list:
        new_list.extend([word for word in i if len(word) > 7])
    return new_list

main()

Лично я бы сделал так:

for key in word_dict.keys():
    word_dict[key] = [x for x in word_dict[key] if len(x)>7]

Или вы можете использовать свойство удаления списка следующим образом:

for word in new_list:
    print(word)
    letter_length = len(word)
    if letter_length <= 7:
        new_list.remove(word)

Альтернативный способ: -

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

Вы должны использовать функцию remove вместо pop

Функция remove() принимает один элемент в качестве аргумента.

Функция pop() принимает один аргумент (индекс) и удаляет элемент, присутствующий в этом индексе.

Подробнее:

https://docs.python.org/3/tutorial/datastructures.html

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


res =[]

for i in word_dict:
    tmp =[j for j in word_dict[i] if len(j)<=7]
    res.extend(tmp)

print(res)

# output ['display', 'exhibit', 'convey', 'gradual', 'late', 'behind', 'tedious', 'slack']

Другие вопросы по теме