Python: ValueError: list.remove (x): x отсутствует в списке - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь найти похожие слова в группе строк.Я использую SequenceMatcher от difflib.

И как только подобное слово найдено, чтобы избежать дублирования, я пытаюсь удалить его с помощью .remove(word), но получаю ошибку как ValueError: list.remove(x): x not in list.

Могу ли я знать, почему я не могу удалить этот элемент из списка?

tags = ['python', 'tips', 'tricks', 'resources', 'flask', 'cron', 'tools', 'scrabble', 'code challenges', 'github', 'fork', 'learning', 'game', 'itertools', 'random', 'sets', 'twitter', 'news', 'python', 'podcasts', 'data science', 'challenges', 'APIs', 'conda', '3.6', 'code challenges', 'code review', 'HN', 'github', 'learning', 'max', 'generators', 'scrabble', 'refactoring', 'iterators', 'itertools', 'tricks', 'generator', 'games']

similar_tags = [] 
for word1 in tag:
    for word2 in tag:
        if word1[0] == word2[0]:
            if 0.87 < SequenceMatcher(None, word1, word2).ratio() < 1 :
                similar_tags.append((word1,word2))
                tag.remove(word1)


 print(similar_tags) # add for debugging

Но я получаю ошибку как

Traceback (most recent call last):
  File "tags.py", line 71, in <module>
    similar_tags = dict(get_similarities(tags))
  File "tags.py", line 52, in get_similarities
    tag.remove(word1)
ValueError: list.remove(x): x not in list

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

вы изменяете список, который вы перебираете, что плохо делать

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

similar_tags = [] 
to_be_removed = []
    for word1 in tag:
        for word2 in tag:
            if word1[0] == word2[0]:
                if 0.87 < SequenceMatcher(None, word1, word2).ratio() < 1 :
                    similar_tags.append((word1,word2))
                    to_be_removed.append(word1)

for word in to_be_removed:
    if word in tag:
        tag.remove(word)
print(similar_tags) # add for debugging
0 голосов
/ 07 октября 2018

Если у вас есть два слова word21 и word22, которые совпадают с word1 при указанных ограничениях, когда вы удаляете из списка для word21, в списке не будет word1удалено для word22.

Следовательно, вы можете исправить это следующим изменением:

for word1 in tag:
    is_found = False #add this flag
    for word2 in tag:
        if word1[0] == word2[0]:
            if 0.87 < SequenceMatcher(None, word1, word2).ratio() < 1 :
                is_found = True #true here as you want to remove it after the termination of the current loop
                similar_tags.append((word1,word2))
    if is_found: #if founded this word under the specified constraint at least one time, the remove it from the list
        tag.remove(word1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...