Как удалить из словаря значения, длина которых меньше указанной длины? - PullRequest
1 голос
/ 26 мая 2019

В этом коде я пытаюсь удалить значения (синонимы) из списка, который состоит из 7 или менее символов из словаря.По какой-то причине мой код только частично удаляет значения длиной не более 7 символов.Кроме того, не удаляйте никакие функции и не используйте импорт и наборы для решения и сохранения текущего кода как можно более целым.

Мой текущий вывод:

{'show': ['exhibit', 'note', 'point to', 'indicate', 'reveal', 'demonstrate'], 'slow': ['unhurried', 'leisurely', 'behind', 'slack'], 
'dangerous': ['perilous', 'hazardous', 'uncertain']}

Желаемый вывод:

{'show' : ['demonstrate', 'indicate', 'point to'], 
'slow' : ['leisurely', 'unhurried'],
'dangerous' : ['hazardous', 'perilous', 'uncertain']}
word_dict = {'show': ['display', 'exhibit', 'convey', 'communicate', 'manifest', 'disclose'],
             'slow': ['unhurried', 'gradual', 'leisurely', 'late', 'behind', 'tedious', 'slack'],
             'dangerous': ['perilous', 'hazardous', 'uncertain']}

def main():
    edited_synonyms = remove_word(word_dict)
    print(edited_synonyms)

def remove_word(word_dict):
    for key, value in word_dict.items():
        for item in value:
            if len(item) <= 7:
                value.remove(item)
    return word_dict

main()

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

Создайте новый список, чтобы отфильтровать значения длиной> 7, а затем назначьте его соответствующей клавише.
Просто вы можете изменить свой код следующим образом:

word_dict = {'show': ['exhibit', 'note', 'point to', 'indicate', 'reveal', 'demonstrate'], 'slow': ['unhurried', 'leisurely', 'behind', 'slack'],
            'dangerous': ['perilous', 'hazardous', 'uncertain']}

def main():
    edited_synonyms = remove_word(word_dict)
    print(edited_synonyms)

def remove_word(word_dict):
    for key, value in word_dict.items():
        new_val = []
        for item in value:
            if len(item) > 7:
                new_val.append(item)
        word_dict[key] = new_val
    return word_dict

main()
2 голосов
/ 26 мая 2019

Вы изменяете тот же список, который итерируете, когда делаете for item in value:.
Вместо этого вам нужно перебрать value[:], который возвращает копию массива

word_dict = {'show': ['exhibit', 'note', 'point to', 'indicate', 'reveal', 'demonstrate'], 'slow': ['unhurried', 'leisurely', 'behind', 'slack'],
'dangerous': ['perilous', 'hazardous', 'uncertain']}

def main():
    edited_synonyms = remove_word(word_dict)
    print(edited_synonyms)

def remove_word(word_dict):
    for key, value in word_dict.items():
        #Iterate on copy of value
        for item in value[:]:
            if len(item) <= 7:
                value.remove(item)
    return word_dict

main()

Выход будет

{
'show': ['point to', 'indicate', 'demonstrate'], 
'slow': ['unhurried', 'leisurely'],
 'dangerous': ['perilous', 'hazardous', 'uncertain']
}

Другой вариант - создать новый список, добавить в список слова с len>7 и назначить список ключу словаря

 word_dict = {'show': ['exhibit', 'note', 'point to', 'indicate', 'reveal', 'demonstrate'], 'slow': ['unhurried', 'leisurely', 'behind', 'slack'],
'dangerous': ['perilous', 'hazardous', 'uncertain']}

def main():
    edited_synonyms = remove_word(word_dict)
    print(edited_synonyms)


def remove_word(word_dict):
    for key, value in word_dict.items():

        #List of holding words with len more that 7
        li = []
        for item in value:
            #Add words with len more than 7 to the list
            if len(item) > 7:
                li.append(item)
        #Assign the list to the key
        word_dict[key] = li
    return word_dict

main()
1 голос
/ 26 мая 2019

Это можно сделать, используя сложный список:

edited_synonyms = {k: [w for w in v if len(w) >= 7] for k, v in word_dict.items()}

Я предлагаю вам использовать это вместо того, чтобы пытаться изменить коллекцию во время итерации по ней. Это также более эффективно, чем другие имеющиеся опции.

...