2015-07-31 4 views
1

У меня есть список кортежей. Некоторые кортежи должны быть исключены из списка в зависимости от их значений. Пример списка с 2-кортежами ниже:Python list comprehension условный фильтр синтаксис

orig_list = [('mydomain', '20150726', 'e-buyeasy.com', 'www.ujizlhekw.e', '1', 
'1', '1', '1', '100.0', '0.0'), 
('myotherdomain', '20150726', 'floating-share-buttons.com', '', '26', 
'26', '26', '26', '100.0', '0.0')] 

Я создал функцию, которая использует сопоставление регулярных выражений из двух элементов кортежей против других списков «подстановки». Функция возвращает True или False в зависимости от соответствия спискам поиска.

def tupMatch(tup): 
    sourceReg="semalt.*","anticrawler.*","best-seo-offer.*","best-seo-solution.*","buttons-for-website.*","buttons-for-your-website.*","7makemoneyonline.*","-musicas*-gratis.*","kambasoft.*","savetubevideo.*","ranksonic.*","medispainstitute.*","offers.bycontext.*","100dollars-seo.*","sitevaluation.*","dailyrank.*","videos-for-your-business.*","videos-for-your-business.*","success-seo.*","4webmasters.*","get-free-traffic-now.*","free-social-buttons.*","trafficmonetizer.*","traffic2money.*","floating-share-buttons.*" 

    hostnameReg="mydomain.*","myotherdomain.*" 

    sourceReg2 = "(" + ")|(".join(sourceReg) + ")" 
    hostnameReg2 = "(" + ")|(".join(hostnameReg) + ")" 

    sourceMatch = re.match(sourceReg2, tup[2].lower()) 
    hostMatch = re.match(hostnameReg2, tup[3].lower()) 

    if (not sourceMatch) and (hostMatch): 
     True 
    else: 
     False 
    return 

У меня есть список, который фильтрует исходный список в зависимости от результата функции.

filtered_list = [tup for tup in orig_list if tupMatch(tup)] 

Однако на самом деле это не фильтрация списка. Я ожидаю, что 'tupMatch (tup)' вернет либо True, либо False, и в понимании списка будут только кортежи True.

Что мне здесь не хватает?

ответ

1

Следующие строки не return (без return ключевых слов); Функция неявно возвращает None; который считается ложным значением.

if (not sourceMatch) and (hostMatch): 
    True 
else: 
    False 

Изменение строки в следующей редакции:

if (not sourceMatch) and (hostMatch): 
    return True 
else: 
    return False 

или более коротко:

return (not sourceMatch) and (hostMatch) # OR return bool(...) 
+0

Ах, совершенный благодаря – curtisp