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()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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']

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