2011-04-11 2 views
2

어떤 요소가 고유한지 확인하기 위해 사전과 장고 쿼리 세트를 교차 참조하고자합니다. dictionary['name']djangoModel.name 값입니다. 에 내가 지금하고 있어요 방법은 다음과 같습니다Pythonic 방법은 특정 속성에 대한 사전 목록을 구문 분석합니까?

  • 이 사전의 목록을 만들기 [ '이름']
  • 이 djangoModel.name의 목록
  • 에 의해 고유 한 값의 목록을 생성 가치를 창출 값 다음과 같이 해당 목록에 포함 점검

이 보인다 :

alldbTests = dbp.test_set.exclude(end_date__isnull=False) #django queryset 

vctestNames = [vctest['name'] for vctest in vcdict['tests']] #from dictionary 
dbtestNames = [dbtest.name for dbtest in alldbTests] #from django model 

# Compare tests in protocol in fortytwo's db with protocol from vc 

obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in vctestNames] 
newTests = [vctest for vctest in vcdict if vctest['name'] not in dbtestNames] 

세대에 가지고 unpythonic 느낌 그 직후에 포함 여부를 확인할 수 있도록 중간 이름 목록 (위의 2 행과 3 행)을 삭제하십시오. 내가 놓친 게 있니? 나는이 같은 한 줄에 두 개의 지능형리스트를 넣을 수도있을 것 같군요 :

obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in [vctest['name'] for vctest in vcdict['tests']]] 

을하지만 그것은 따라하기 어려워 보인다.

편집 :

# vcdict is a list of django models where the following are all true 
alldBTests[0].name == 'test1' 
alldBTests[1].name == 'test2' 
alldBTests[2].name == 'test4' 

dict1 = {'name':'test1', 'status':'pass'} 
dict2 = {'name':'test2', 'status':'pass'} 
dict3 = {'name':'test5', 'status':'fail'} 

vcdict = [dict1, dict2, dict3] 

나는 세트로 변환하고 난 그냥 이름 문자열까지 일을 제거하지 않는 한 차이를 가지고,하지만 난 잃을 수 없습니다 :이 같은 초기 상태의 생각해 나머지 모델/사전에 대한 액세스, 맞습니까? 두 경우 모두 같은 유형의 객체를 사용하면 세트 만 작동합니다.

+0

당신이 몇 가지 예제 데이터를 제공시겠습니까를? 질문을 쉽게 시각화 할 수 있습니다. 그러나 너무 깊이 들여다 보지 않고 두 개의 서로 다른 이름 목록에서 고유 한 멤버를 찾고있는 경우 두 개의'set() '컨테이너를 비교할 수있는 완벽한 장소 인 것 같습니다. – jathanism

답변

4
vctestNames = dict((vctest['name'], vctest) for vctest in vcdict['tests']) 
dbtestNames = dict((dbtest.name, dbtest) for dbtest in alldbTests) 

obsoleteTests = [vctestNames[key] 
       for key in set(vctestNames.keys()) - set(dbtestNames.keys())] 

newTests = [dbtestNames[key] 
      for key in set(dbtestNames.keys()) - set(vctestNames.keys())] 
: 두 개체 목록 (pseudopython)를 비교할 때

obsoleteTests = list(set([a.name for a in alldbTests]) - set(vctestNames)) 

세트는 정말 유용을

+1

올바른 것은 소문자 "s"와 함께'set'입니다 – jsbueno

+0

고마워요. – manji

+0

그것들은 문자열의 집합이 될 것입니다. 나는 세트를 사용하기를 원한다는 것에 동의하지만 나의 실제 질문은 "어떻게 전체 사전 (또는 장고 모델) 객체로 작업하면서 세트가 제공하는 기능을 사용합니까?"라고 생각합니다. – Nathan

2

기본 설정 작업을 수행하고 있습니다. 당신은 세트에 객체를 변환 단지 교차로 (벤 다이어그램을 생각) 찾을 수 :

set(a) - set(b)    = [c for c in a and not in b] 
set(a) + set(b)    = [c for c in a or in b] 
set(a).intersection(set(b)) = [c for c in a and in b] 
+0

그러나 obsoleteTests는 데이터베이스의 모델이 아닌 이름 목록입니다. 전체 모델이 필요합니다. – Nathan

+0

Django님께. 왜 너는 그렇게 힘들게 만든거야?!?!? – Blender

+0

보기 - 그건 사실입니다. 나는 사전과 장고 모델의 두 종류의 객체 목록을 가지고있다. 그 (것)들을 비교하는 유일한 방법은 각각에 다른 그들의 name 속성에 의한 것이다. – Nathan

관련 문제