2009-10-16 6 views
14

나는 다음과 같은 데이터 구조를 가지고 :사전 목록에서 파이썬 사전 값을 검색하는 가장 좋은 방법은 무엇입니까?

data = [ 
     {'site': 'Stackoverflow', 'id': 1}, 
     {'site': 'Superuser', 'id': 2}, 
     {'site': 'Serverfault', 'id': 3} 
    ] 

내가 그것을 특정 값을 가진 모든 사이트가 있는지 확인하기 위해 위의 목록을 검색 할를. 예를 들어 위의 내용을 검색하여 목록에 site = 'Superuser'가 포함 된 사전이 있는지 확인하고 True/False를 반환합니다. 위의 일반적인 방법으로 각 항목을 반복하고 비교할 수 있습니다. 검색을 수행하는 다른 방법이 있습니까?

+3

데이터가 정렬되어 있으면 최적화가 있습니다. 그렇지 않다면'any()'해결책을 사용하십시오. – Triptych

답변

25
any(d['site'] == 'Superuser' for d in data) 
+9

와우, 우리는 * 정확한 * 동일한 내용을 서로 10 초 이내에 게시했습니다. 내 것을 지우 겠어. : – FogleBird

+1

정확히이 "각 항목을 반복하고 그들을 비교", 티에리 램이 원하지 않는 것입니다. – nosklo

+0

나는 그가 보통의 for 루프를 의미한다고 생각합니다. –

4

목록에는 절대적으로 루프가 필요합니다. 그것이 바로 목록입니다.

반복을 피하려면 목록을 피하십시오.

검색 키와 개체의 사전이 필요합니다.

sites = dict((d['site'],d) for d in data) 
ids = dict((d['id'],d] for d in data) 

이제 대신 루프의 해시 조회를 사용 sites["Superuser"]와 '슈퍼 유저'와 관련된 항목을 찾을 수 있습니다.

9
filter(lambda x: x['site']=='Superuser', data) 
1

나는 파이썬 구문의 모르겠지만, 이런 식으로 당신을 위해 일한다 수도 있습니다. 기본 데이터 구조를 작성하는 동안 사이트 이름에 키가있는 해시 또는 연관 배열 인 병렬 구조도 작성하십시오. 지정된 사이트가 존재하는지 확인하기 위해 사이트 이름으로 해시에서 조회를 시도합니다. 성공하면 데이터 구조에 해당 사이트에 대한 레코드가 있음을 알고 해시 기술 (해시 기술에 따라 O (1) 또는 O (log2 (n)) 일 가능성이 있음) 목록 탐색의 O (n/2)

(글을 쓰는 동안 업데이트 됨 : 이것은 S.Lott이 게시 한 것입니다)

관련 문제