2012-12-27 5 views
2

특정 단어 집합에 대한 문자열 집합을 검색하고 다양한 부울 조건이 충족되면 일부 동작을 수행하려고합니다. 나는 현재 접근 방식을 가지고 있지만, 내가 가지고있는 것보다 더 우아한 방법이 있기를 바라고 있습니다.파이썬에서 문자열의 길이가 부울 검색

strings = ['30 brown bears', '30 brown foxes', '20 green turtles', 
      '10 brown dogs'] 

for text in strings: 
    if ('brown' in text) and ('bear' not in text) and ('dog' not in text): 
     print text 

이것은 원하는대로 작동하며 30 brown foxes을 인쇄합니다. 그러나 나를 걱정하는 것은 검색에 더 많은 용어를 추가하는 것입니다. 예를 들어, '고양이', '마우스', '토끼'등이 모두 if-statement에 추가되면 어떻게됩니까? 이것은 물건에 접근하는 clunky하고 비 - Python 방법 인 것처럼 보인다. 그래서 나는 누군가 이것을하기 위해 다른 길을 가지기를 바라고있다.

답변

4

나는 이것이 가장 좋은 방법은 의심하지 않지만, 당신이 할 수있는 한 가지 다른 두 컨트롤 개체와 함께 all을 사용하는 것입니다 - (이 경우, brown)를 포함 할 항목을 포함 하나, 그리고 무시하려는 사람들을 포함하는 다른 사람 :

In [1]: strings = ['30 brown bears', '30 brown foxes', '20 green turtles', '10 brown dogs'] 

In [2]: keep = ('brown') 

In [3]: ignore = ('bear', 'dog') 

In [4]: for text in strings: 
    ...:  if all([k in text for k in keep] + [i not in text for i in ignore]): 
    ...:   print text 
    ...:   
    ...:   
30 brown foxes 
+0

우리는 비슷한 생각을 가지고 있었지만, 나는 당신을 더 좋아합니다. –

+0

두 아이디어가 모두 마음에 들었지만, 앞으로이 아이디어를 받아 들일 것입니다. 그러나 두 가지 대답을 모두 좋아하며 두 가지 모두를 가지고 놀 것입니다. 도움 주셔서 감사합니다. – user1074057

+0

@ user1074057 전혀 문제 없습니다. 행복하게 도와 줬습니다! – RocketDonkey

2
>>> strings = ['30 brown bears', '30 brown foxes', '20 green turtles', '10 brown dogs'] 
>>> conditions = [('brown', True), ('bear', False), ('dog', False)] 
>>> for text in strings: 
    if all((x in text) == c for x,c in conditions): 
     print text 

30 brown foxes 
+0

+1 - 조건과 단어를 짝 지어주는 것이 좋습니다. – RocketDonkey

관련 문제