Я пытался выполнить упражнение, которое требует от меня удаления слов в словаре, содержащем слова длиной 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()
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()
принимает один аргумент (индекс) и удаляет элемент, присутствующий в этом индексе.
Подробнее:
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']