2015-03-27 3 views
1

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

Следующий список содержит: [ 'pm_pmdo', 'pm_pmco', 'SHV', 'DSV', 'PMV']

Проверка на следующее: она, DSE, PME

внутри найдено один?

class newfunc(object): 

    def testfunction(self): 

     self.DSE = 'dse' 
     self.PME = 'pme' 
     self.SHE = 'she' 

     self.users_roles = ['pm_pmdo', 'pm_pmco', 'shv', 'dsv', 'pmv'] 

     print 'Following list contains:' 
     print self.users_roles 
     print 'Checking for the following:' 
     print self.SHE 
     print self.DSE 
     print self.PME 

     if (self.DSE or self.PME or self.SHE for s in self.users_roles): 
     #if (self.DSE or self.PME or self.SHE) in self.users_roles: 
      print "inside found one" 
     else: 
      print "outside none found" 

if __name__ == '__main__': 
    runtime = newfunc() 
    runtime.testfunction() 

ответ

0

Использование any, которые короткие замыкания возвращает истину, если мы находим совпадение или вычисляет значение False в противном случае:

if any(s in self.users_roles for s in (self.DSE , self.PME , self.SHE)) 

Ваш код всегда имеет значение True в if self.DSE основном проверка if bool(self.DSE) который всегда будет вычисляться True для любой не пустой строки, то же самое для self.PME и self.SHE.

In [21]: bool("foo") # will be the same for all non empty strings 
Out[21]: True 

In [22]: bool("") 
Out[22]: False 

Вы можете также сделать self.users_roles набор и использовать set.intersection:

self.users_roles = {'pm_pmdo', 'pm_pmco', 'shv', 'dsv', 'pmv'} 

if self.users_roles.intersection([self.DSE, self.PME, self.SHE]) 
+0

Ouch .. Так что-то вроде этого тоже было бы большим нет? если self.PME имеет vailue тогда - если (self.PME) в self.users_roles: Спасибо! –

+0

@DaveJones, если вы не хотите, чтобы если бы значение true для каждой непустой строки возможно, тогда да, это большой нет нет;) Единственный способ, которым это когда-либо было бы False, если бы вы получили пустые строки. Если вы выполняете много проверок, набор будет намного эффективнее, чем любой. Правильный способ написать это будет 'if self.DSE ​​в self.users_roles или self.PME в self.users_roles и т. Д.', Но это становится довольно уродливым, когда у вас есть несколько, чтобы проверить, чтобы любой был просто более кратким способом сделать это. –

2
if any(role in self.users_roles for role in (self.SHE, self.PME, self.SHE)): 
1

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

class NewFunc(object): 
    def testfunction(self): 
     self.DSE = 'dse' 
     self.PME = 'pme' 
     self.SHE = 'she' 

     self.users_roles = {'pm_pmdo', 'pm_pmco', 'shv', 'dsv', 'pmv'} 

     print 'users_roles:' 
     print list(self.users_roles) 
     print 'Checking for the following:' 
     print self.SHE 
     print self.DSE 
     print self.PME 

     if {self.DSE, self.PME, self.SHE} & self.users_roles: 
      print "found at least one" 
     else: 
      print "none found" 

if __name__ == '__main__': 
    runtime = NewFunc() 
    runtime.testfunction() 
+0

@ DSM: Извините ... случайный. – martineau

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