2017-02-07 3 views
1

일부 패턴 일치를 수행하고 문자열의 일부가 문자열 목록에 나타나는지 확인하려고합니다. 이 같은 이렇게 뭔가 :일치하는 항목이 일치하는 경우

if any(x in line for x in aListOfValues):

그것은 라인에 추가 x의 값을 반환 할 수 있습니까?

+0

가능한 복제 [: 당신은 당신이 패턴을 찾을거야 확실하지 않으면 StopIteration 예외에 대해 보호해야합니다 조건 일치?] (http://stackoverflow.com/questions/2361426/what-is-the-best-way-to-get-the-first-item-from-aniterable-matching-a-condition) –

답변

3

next()을 사용하면 유사한 생성기에서 다음 일치 항목을 검색 할 수 있습니다 (False 기본값). 이 경우에만 이 (가) 첫 번째로 일치를 반환하며 모든 일치가 아닌 것으로 보입니다.

match = next((x for x in aListOfValues if x in line), False) 

또는 매우 간단한 해결책은 루프로 현재 문을 해체하고 x을 포함하는 튜플뿐만 아니라 라인을 반환 할 수 있습니다.

def find(line, aListOfValues): 
    for x in aListOfValues: 
     if x in line: 
      return x, line 
    return False, line 
+1

또한'next' **를 추가하면 **는 조건이 True 인 첫 번째 항목 만 반환하고 여러 항목 인 경우 모두를 반환하지는 않습니다. 적어도 여기에서는 사용되지 않습니다. –

+0

@ Ev.Kounis 나는 OP의 질문에서 그런 식으로 해석했다. 그러나 확실히, 나는 그것을 더 분명하게했다. – miradulo

+1

감사합니다. "일치"솔루션을 고수하십시오. – Conor

1

당신은 첫 번째 항목을 소모하여 할 수는 next를 사용하여 일치에 돌아왔다. 반복 가능에서 첫 번째 항목을 얻을 수있는 가장 좋은 방법은 무엇의

try: 
    print (next(x for x in aListOfValues if x in line)) 
except StopIteration: 
    print("Not found") 
0
aListOfValues = ["hello", "hallo"] 
line = "hello world" 
#classic one 
res = [x for x in aListOfValues if x in line] 
print res 
>>['hello'] 

# back to your case 
if any(x in line for x in aListOfValues): 
    print set(aListOfValues) & set(line.split()) 
>> set(['hello']) 

match = set(aListOfValues) & set(line.split()) 
if match: #replace any query 
    print match 
>> set(['hello']) 
관련 문제