Логическая ошибка Python, использующая a для каждого цикла для удаления элементов из списка

#python #list #oop #logic #tweepy

#python #Список #ооп #Логические #tweepy

Вопрос:

Итак, у меня есть список из примерно 300 твитов, записанных с помощью Tweepy. Многие из этих твитов являются ретвитами, которые я хочу удалить из списка. Их можно легко идентифицировать, поскольку они начинаются с «RT @».

Моя проблема в том, что, несмотря на то, какой метод я пробую, некоторым из этих твитов удается пройти через мой цикл без удаления. Я попробовал несколько вариантов того, что вы видите ниже, включая функцию «startswith» и оператор «in», которые я сделал ниже.

Вы видите, что я делаю не так?

 def CleanData(tweets):
    removed_tweets = []
    for tweet in tweets:
      if ("RT @") in tweet.full_text:
          tweets.remove(tweet)
          removed_tweets.append(tweet)
    return tweets
 

Ответ №1:

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

Взгляните на результат операции удаления, которую я опробовал в простом списке:

list2=[‘x’,’y1′,’y2′,’x’] для i в list2: … print(i) … если i==’x’: … list2.remove(i)

Вывод: x y2 x

Я предлагаю вам использовать метод фильтрации python в списке. Это значительно упростит ваш код.

Комментарии:

1. список (фильтр (лямбда x: x!=’x’,list2)) Вот как я создал метод фильтрации из исходного кода. Вы можете попробовать свой! @M5RKED