2017-03-27 3 views
0

나는리스트 comprehensions와 문자열로 재미있는 시나리오를 밟고있다. 여기에 시나리오의 간단한 예입니다 :파이썬리스트 문자열로 이해하기

이를 :

banned = ['apple', 'pear'] 
sentence = 'I will eat an apple'  
if(not x in sentence for x in banned): print('ok') 

결과 :

'사과'는 문장에 나타납니다 비록
ok 

. 나는 그 이해력을 잘못 쓰었습니까? '금지'단어가 '문장'에 있으면 'ok'가 인쇄되어서는 안됩니다.

+1

비 빈 목록 (어떤 값)를 사용하면'all' 키워드 뒤에있어 – FamousJameous

+7

truthy입니다 - '만약 모든 (하지 금지에 x의 문장 X) : 인쇄 ('OK ')' – asongtoruin

+1

'x not in sentence'를 사용하면 조금 더 명확 해집니다. – barny

답변

1

다음 부분 :

(not x in sentence for x in banned) 

에 관계없이 내용이 무엇이든의, True로 평가됩니다 발전기 식입니다.

여러 항목의 진위 값을 확인하려는 경우 문제를 기반으로 any 또는 all 기능을 사용할 수 있습니다. 이 경우

은 당신이 all()이 필요하다고 보인다

또한
banned = ['apple', 'pear'] 
sentence = 'I will eat an apple'  
if all(x not in sentence for x in banned): 
    print('ok') 

이 부분 x not in sentence가 전체 문자열 내 말을 회원을 확인하세요 않습니다. 즉, 입력 문자열 내의 단어 중 하나에 banned 내에 단어가 포함되어 있으면 True를 반환합니다. 단어 pear을 포함하는 pearl과 같습니다.

이 문제를 해결하는 한 가지 방법은 스플릿 된 텍스트의 멤버 자격을 확인하거나 정규식을 사용하는 것입니다.

또 다른 대안은 set과 교차을 사용하는 것입니다 : 장 - FrançoisFabre가 ​​방금 교차로를 확인하려면 이후 set.isdisjoint()보다는 set.intersection를 사용하는 것이 좋습니다 언급

banned = {'apple', 'pear'} # use set instead of list 
sentence = 'I will eat an apple' 
if banned.intersection(sentence.split()): 
    print('ok') 

@으로.

banned = {'apple', 'pear'} # use set instead of list 
sentence = 'I will eat an apple' 
if not banned.isdisjoint(sentence.split()): 
    print('ok') 
+0

'만일 banned.intersection (sentence.split()) :'는'set'을 만듭니다. 이것은 낭비입니다. '금지되지 않음 .isdisjoint()'를 조건으로 사용하는 것이 더 좋습니다. –

+0

@ Jean-FrançoisFabre'isdisjoint()'는이 문제에 대해 올바른 결과를 반환하지 않습니다. 'banned.isdisjoint ('apple pear banana'.split())'를 시도해보십시오. – Kasramvd

+0

나는 '사과', '배'라고 쓰지 않았습니다. '사과 배 바나나'(사과 배). isdisjoint는 교차가 비어 있지 않다는 것을 의미합니다. 그거야. –