2013-04-15 2 views
22

튜플 목록을 반복하여 올바른 일치를 찾는 데 더 빠르고 시간이 절약되는 방법이 있는지 궁금합니다. 내가하는 일은 다음과 같습니다 :튜플 목록을 신속하게 반복

# this is a very long list. 
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

# go through entire list and look for match 
for j in my_list: 
    if j[0] == VALUE: 
     PAIR_FOUND = True 
     MATCHING_VALUE = j[1] 
     break 

이 코드는 목록의 항목 수에 따라 실행하는 데 꽤 시간이 걸릴 수 있습니다. 이렇게하는 더 좋은 방법이있을 것이라고 확신합니다.

답변

14

조금 더 많은 메모리 사용이 문제가되지 않는다고 가정하고 튜플의 첫 번째 항목이 해시 가능이면 튜플 목록에서 dict을 생성 한 다음 키를 찾는 것만 큼 값을 찾는 것이 간단합니다 dict에서 같은 뭔가 :

dct = dict(tuples) 
val = dct.get(key) # None if item not found else the corresponding value 

편집는 : 나는 아래의 방법은 당신이 원하는 무엇인지 궁금

revDct = dict((val, key) for (key, val) in tuples) 
+0

좋아 보이지만 그렇게 될 것입니다. '오래된 가치'로만 검색 할 수 있습니다. 새롭고 오래된 값 필드에서 검색 할 수 있도록 두 개의 dicts를 만들어야합니까? – memyself

+0

@memyself : 네, 맞습니다. * 이전 값과 새 값을 모두 검색해야하는 경우 두 개의 dict을 작성해야합니다. 그러나 당신이 원한다면 빠른 조회 만 있으면 나쁘지 않다고 생각합니다. reverse dict를 만들기위한 샘플 스 니펫을 추가했습니다. –

+0

나는 get()에 대해 몰랐다. 이것은 내 인생을 훨씬 단순하게 만들었다. – dgBP

25

난 당신이 코드는 정리 될 수 있지만, 당신은 당신의 튜플을 저장하는 목록을 사용하는 경우, 이러한 조회는 O (N)입니다

for j,k in my_list: 
    [ ... stuff ... ] 
+1

을하지만 루프가 더 빨리 실행하지 않습니다. 그럴거야? – memyself

+0

이 다른 질문을 확인해야합니다. http://stackoverflow.com/questions/2191699/find-an-element-in-a-list-of-tuples – Eric

+0

알아두면 좋겠지 만 tks –

2

사용할 수 있다고 생각합니다.

조회 속도가 중요한 경우 dict을 사용하여 튜플을 저장해야합니다. 키는 튜플의 0 번째 요소 여야합니다. 당신은 쉽게 목록에서 딕셔너리를 만들 수 있습니다

my_dict = dict(my_list) 

그런 (VALUE, my_dict[VALUE])는 당신에게 당신의 일치하는 튜플을 줄 것이다 (VALUE를 존재 가정).

0

: 같은 것을, 역 매핑을 만들어 사용합니다.

defaultdict을 사용할 수 있습니다.

>>> from collections import defaultdict 
>>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)] 
>>> d = defaultdict(list) 
>>> for k, v in s: 
     d[k].append(v)  
>>> sorted(d.items()) 
[('blue', [2, 4, 4]), ('red', [1, 3, 1])] 
1

문제는 죽은하지만 여전히 다치게하지 않는 또 하나의 방법을 알고있다 :

my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

for first,*args in my_list: 
    if first == Value: 
     PAIR_FOUND = True 
     MATCHING_VALUE = args 
     break 
관련 문제