2011-11-09 3 views
2

2 차원리스트가 주어지면, 서브리스트를 포함하는 모든 것을 찾고 싶습니다. 나는 다음과 같이 할 수 있다는 것을 깨닫는다 :파이썬에서 서브리스트의 효율적인 매칭

#Psuedo-Python (not kosher) 
def MatchAll(theList,toMatch): 
    result=list(theList) 
    for nMatch in toMatch: 
     for nResult in result: 
      if not nMatch in nResult: 
       result.remove(nResult) 
    return result 

그러나 이것에 관해서는 모든 종류가있는 것처럼 보입니다. 지금까지 보아서 다루었던 파이썬 코드와는 달리, 반복하면서 목록을 변경하는 것 외에는 전혀 읽지 않은 것이 좋은 것은 아닙니다. 또한, 그것은 대단히 비효율적 인 것처럼 보입니다 : toMatch는 내 목적을 위해 3보다 큰 길이를 가져서는 안되지만, List의 길이는 알려지지 않았고 상당히 클 수 있습니다. 어떤 도움이라도 대단히 감사 드리며 미리 감사드립니다.

+0

의미 체계가 전혀 명확하지 않다. "하위 목록이있는 모든 것"은 무엇을 의미합니까? –

답변

3

"일치"목록의 모든 항목과 일치하는 하위 목록 만 유지하면됩니다.

def match_all(the_list, to_match): 
    return [sublist for sublist in the_list 
       if all(item in sublist for item in to_match)] 

당신은 set를 사용하여이 속도를 높일 수 있습니다 :이의

def match_all(the_list, to_match): 
    matches = set(to_match).issubset 
    return [sublist for sublist in the_list if matches(sublist)] 
+0

만약'set (item) <= set (to_match)'조건을 만족 시키십시오. :) –

+0

거룩한 잉어! 그것은 그것이 뒤늦은 지각에서 그렇게 분명해야하는 것처럼 보입니다. 나는 고맙습니다, 선생님. – LHT

+0

어, 당신은 모든 비트를 set() <= set() 비트로 바꾸는 것을 의미합니까? 목록을 세트로 변환하는 것이 너무 비효율적이지 않은 것 같습니까? – LHT

관련 문제