Python:如何从字典中删除元素并将其作为列表返回?

时间:2019-05-22 10:00:52

标签: python list dictionary pop

我一直在尝试一项要求我删除词典中包含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 个答案:

答案 0 :(得分:1)

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']

答案 1 :(得分:1)

您的程序是正确的。您需要通过任何方式在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']

答案 2 :(得分:1)

尝试一下:

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']}

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我个人会这样:

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

答案 5 :(得分:1)

或者您可以通过以下方式使用list的remove属性:-

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

答案 6 :(得分:1)

您应该使用var multi = 1.3; var minX = 1000; var minY = 500; var featurePoly0162 = new ol.Feature({ geometry: new ol.geom.Polygon([ [ [5636*multi - minX,-12903*multi - minY], [5741*multi - minX,-12918*multi - minY], [5753*multi - minX,-12988*multi - minY], [5683*multi - minX,-12996*multi - minY], [5633*multi - minX,-12949*multi - minY] ] 函数而不是remove

pop函数将单个元素作为参数。

remove()函数使用单个参数(索引),并删除该索引处存在的项目。

更多详细信息:

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

答案 7 :(得分:0)

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']