그냥 재미를 위해, itertools
솔루션은 C 층에 당 요소 작업을 밀어 :
from future_builtins import map # Py2 only; not needed on Py3
from itertools import compress
from operator import itemgetter
# Generator
prefixes = map(itemgetter(slice(2)), totalist)
selectors = map(['A','B'].__eq__, prefixes)
# If you need them one at a time, just skip list wrapping and iterate
# compress output directly
matches = list(compress(totalist, selectors))
이 모든 수에 1을 늘어선 :
matches = list(compress(totalist, map(['A','B'].__eq__, map(itemgetter(slice(2)), totalist))))
그러나 나는 권하고 싶지 않다 그것. totalist
가 발생하지 재 반복 가능한 순서있을 경우 부수적으로, 당신은 추가를 두 배로 itertools.tee
을 사용할 것 :
totalist, forselection = itertools.tee(totalist, 2)
및 forselection
이상 map
에 prefixes
의 정의를 변경하지 totalist
; compress
은 두 개의 반복자를 병렬로 반복하므로, tee
은 의미있는 메모리 오버 헤드를 가지지 않습니다.
물론 다른 사람들도 언급했듯이 C로 이동하더라도 이것은 선형 알고리즘입니다. 이상적으로는 collections.defaultdict(list)
과 같은 것을 사용하여 각 list
(tuple
으로 변환하여 dict
키로 변환)의 두 요소 접두사에서 list
인 list
(해당 접두사가있는 문자)으로 매핑하는 것이 좋습니다. 그런 다음 N list
을 선형 검색하는 대신 일치하는 접두사가있는 항목을 찾으려면 totaldict['A', 'B']
을 입력하고 O(1)
검색 (결과는 고정 된 작업이 아닌 고정 된 슬라이스가 아님)으로 결과를 얻습니다.
예 미리 계산 작업 :
from collections import defaultdict
totaldict = defaultdict(list)
for x in totalist:
totaldict[tuple(x[:2])].append(x)
# Optionally, to prevent autovivification later:
totaldict = dict(totaldict)
그럼 당신은 단지 어떤 두 요소 접두어 효과적으로 즉시 matches
를 얻을 수 있습니다 :
matches = totaldict['A', 'B']
코드가 무엇을 시도한다? –
답변을 제안 할 때 어떤 형식으로도 반복하지 않고이를 해결할 방법이 없습니다. 데이터를 효율적으로 확인하는 것이 큰 우선 순위라면 데이터를 어떻게 표현하는지 다시 작성해야합니다. 향상된 속도를 위해 공간의 복잡성을 희생합니다. 예를 들어 목록을 만들 때 어떤 행이 속성을 만족하는지 메모 할 수 있습니다. – gowrath