Reputation: 135
I have been trying an exercise that requires me to remove words in a dictionary containing words that are 7 or fewer characters long. So far I have tried using the .values()
method to get only the words within the square brackets, and thus create a list to store these words. However, I am having a problem with using the pop method where I get
"TypeError: 'str' object cannot be interpreted as an integer".
Here is my code :
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()
Upvotes: 2
Views: 146
Reputation: 11237
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']
Upvotes: 0
Reputation: 20500
list.pop
takes as an argument the index of the item you want to pop from the list, but when you do new_list.pop(word)
, you are actually providing the item itself, hence the error.
From the docs: 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
To fix this, just find the index of the word you want to pop via list.remove()
So the line
new_list.pop(word)
will change to
new_list.remove(word)
But a better approach might be to use a list comprehension like so
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)
The output will be
['communicate', 'manifest', 'disclose', 'unhurried', 'leisurely']
Upvotes: 1
Reputation: 4315
You should use remove
function instead of pop
The remove()
function takes a single element as an argument.
The pop()
function takes a single argument (index) and removes the item present at that index.
More details :
https://docs.python.org/3/tutorial/datastructures.html
Upvotes: 1
Reputation: 403
Or you can use the remove property of list in the below way:-
for word in new_list:
print(word)
letter_length = len(word)
if letter_length <= 7:
new_list.remove(word)
Alternate way:-
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))
Upvotes: 1
Reputation: 4482
Personally I would do it like this:
for key in word_dict.keys():
word_dict[key] = [x for x in word_dict[key] if len(x)>7]
Upvotes: 1
Reputation: 1065
On a list
you can pop elements based on the index.
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()
Upvotes: 1
Reputation: 6935
Try this :
outp = {k: [v for v in word_dict[k] if len(v)<=7 ]for k in word_dict}
Output :
{'show': ['communicate', 'manifest', 'disclose'], 'slow': ['unhurried', 'leisurely']}
Upvotes: 1
Reputation: 5785
Your program is right. Any ways you need to add index
value in pop
.
Modified code:
>>> 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
Output:
>>> main()
['exhibit', 'communicate', 'manifest', 'disclose', 'unhurried', 'leisurely', 'behind', 'slack']
Upvotes: 1