2010-05-05 3 views
1

다음은 제 문제입니다. 동일한 양식의 파이썬 사전 목록이 데이터베이스의 테이블 행을 나타 내기위한 것입니다. 이 같은 : 이미 함수를 작성했습니다Python 사전 목록을 통해 "select distinct ... from ..."을 구현합니다.

[ {'ID': 1, 
    'NAME': 'Joe', 
    'CLASS': '8th', 
    ... }, 
    {'ID': 1, 
    'NAME': 'Joe', 
    'CLASS': '11th', 
    ... }, 
    ...] 

사소한이었다 사전의 목록에서 특정 필드의 고유 값을 얻을 수 있습니다. 내가 아닌 것으로 발견하고

select distinct NAME, CLASS from ...

:

그러나 select distinct NAME from ...

, 나는 여러 독특한 분야, 유사의 목록을 얻을 수 있도록하려면 :이 함수는 같은 것을 구현 -하찮은. 이 quandry를 도와주는 알고리즘이나 파이썬 함수가 있습니까?

CSV 파일을 SQLite 테이블이나 비슷한 것으로로드하기 전에 필자가 사용하는 환경에 대한 옵션이 아니며 저를 신뢰합니다. 이것이 내 생각이었습니다. 당신이 발전기로합니다

+0

모든 고유 한 쌍 또는 모든 고유 한 이름과 고유 한 클래스를 개별적으로 원하십니까? – Claudiu

+0

두 필드 이상으로 문제를 해결하려면 하나의 필드를 사용하면됩니다. – joaquin

+0

@Claudiu 고유 한 쌍이 필요합니다. 만약 내가 따로 따로 원한다면, 나는이 함수를 두 번 호출 할 수있다. 하나 또는 두 개의 필드 이름을 사용하여이를 수행하는 것은 문제가 아니며 'N'개의 필드로 일반화됩니다. – daveslab

답변

9

: 당신은 몇 가지 다른 형태로 결과를 원하는 경우

def select_distinct(dictionaries, keys): 
    seen = set() 
    for d in dictionaries: 
    v = tuple(d[k] for k in keys) 
    if v in seen: continue 
    yield v 
    seen.add(v) 

(예, 대신에 발전기의 목록)가이 (예를 들어, .append받는 사람 변경하기 어렵지 않다 yield ing 대신 초기에 비어있는 결과 목록을 만들고 결과 목록을 끝에 반환하십시오.

for values_tuple in select_distinct(thedicts, ('NAME', 'CLASS')): 
    ... 

등과 같은 물론, 호출합니다. 당신이 row_list가 dicts 목록은

0

distinct_list =리스트() row_list D에 대한 (d [ '이름', D [ 'CLASS'])]()로 설정

0

해싱을 사용하여 작업을 구현할 수 있습니다. 고유 쿼리에 나타나는 행의 내용을 해시하고 동일한 해시를 가진 행의 내용을 무시하십시오.