2016-11-06 2 views
0

Итак, я создал скрипт, который скрежет некоторых сайтов и строит список результатов. Каждый результат имеет следующую структуру:Фильтровать элементы из списка на основе их, содержащие условия спама

result = {'id': id, 
      'name': name, 
      'url': url, 
      'datetime': datetime, 
     } 

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

def filterSpamGigsList(theList): 
    index = 0 
    spamTerms = ['paid','hire','work','review','survey', 
       'home','rent','cash','pay','flex', 
       'facebook','sex','$$$','boss','secretary', 
       'loan','supplemental','income','sales', 
       'dollars','money'] 
    for i in theList: 
     for y in spamTerms: 
      if y in i['name'].lower(): 
       theList.pop(index) 
       break   
      index += 1 
    return theList 

Любой ключ, почему это не может быть отфильтровывая все результаты, содержащие эти термины спам? Может быть, мне нужно вызвать .split() на имя после вызова .lower(), поскольку некоторые из имен являются фразами?

+0

Вы изменяете 'theList' на месте, итерации по нему. Изменяет ли строку 'для i в списке:' to 'для i в списке справки [:]:'? 'theList [:]' в основном делает копию списка. – Jakub

+0

Я думаю, что вы можете достичь этого в одиночном для цикла ... для i в результатах: , если я ['name']. Lower() в spamTerms: print i – Transhuman

+1

@Jakub Это имеет большой смысл! Спасибо! – gareit

ответ

1

Я думаю, у вас возникла проблема с заменой объекта на место, как итерация над ним, как предложил Якуб.

Невероятным способом было бы вернуть новый список. Я бы разделил это на две функции для удобочитаемости:

def is_spam(value): 
    spam_terms = ['paid','hire','work','review','survey', 
       'home','rent','cash','pay','flex', 
       'facebook','sex','$$$','boss','secretary', 
       'loan','supplemental','income','sales', 
       'dollars','money'] 
    for term in spam_terms: 
     if term in value.lower(): 
      return True 
    return False 

def filter_spam_gigs_list(results): 
    return [i for i in results if not is_spam(i['name'])] 
+0

Привет, Конрад, спасибо, потому что мне очень нравится форма вашего решения. Тем не менее, я попробовал это, и, похоже, он работал, чтобы отфильтровать результаты с «оплаченными» в них. Я думаю, что это было связано с вашим возвратом. Ложное использование. Вместо того, чтобы возвращать функцию True или False mid, я использовал setSpam = False в начале функции, а затем в члене if в value.lower() проверил бы setSpam = True, а затем вернул setSpam в конце. Кажется, что это правильно фильтрует. – gareit

+0

Привет! Рад быть полезным. Однако я удивлен своими проблемами. Я только что скопировал свое решение на Python 2.7.11 и Python 3.4.4 Idle и работает как шарм. Для результата списка = [{'id': 1, 'name': 'sex stuff'}, {'id': 2, 'name': 'good one'}, {'id': 3, 'name' : 'paid'}, {'id': 4, 'name': 'возможно, вы хотите арендовать автомобиль'}] он вернул только «хороший» ... –

Смежные вопросы