Python: Как удалить элементы из словаря и вернуть его в виде списка? - PullRequest
1 голос
/ 22 мая 2019

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

«TypeError: объект 'str' нельзя интерпретировать как целое число".

Вот мой код:

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()

Ответы [ 8 ]

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

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

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))
1 голос
/ 22 мая 2019

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

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

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

Подробнее:

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

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

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

for key in word_dict.keys():
    word_dict[key] = [x for x in word_dict[key] if len(x)>7]
1 голос
/ 22 мая 2019

На 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()
1 голос
/ 22 мая 2019

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

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']}
1 голос
/ 22 мая 2019

Ваша программа верна. Любые способы добавить значение 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']
1 голос
/ 22 мая 2019

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

ОтДокументы: https://docs.python.org/3/tutorial/datastructures.html

list.pop ([i])
Удалить элемент в заданной позиции в списке и вернуть его.Вы можете легко решить эту проблему, используя словарное понимание, когда вы включаете в свой список только значения длиной> 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']
0 голосов
/ 22 мая 2019
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']
...