2014-11-05 7 views
1

Simple Salesforce라는 모듈을 사용하여 Salesforce 데이터베이스에서 데이터를 쿼리합니다. 데이터는 다시 OrderedDict로 반환됩니다. 이것을 어떻게 간단한 파이썬리스트로 파싱 할 수 있을까요? 조회 할 때이 반환 될 때 처음 두 항목의OrderedDict에서 Python 목록으로 구문 분석

샘플 :

OrderedDict([ 
    (u'totalSize', 418), 
    (u'done', True), 
    (u'records', [ 
     OrderedDict([ 
      (u'attributes', OrderedDict([ 
       (u'type', u'Case'), 
       (u'url', u'/services/Case/11111') 
       ])), 
      (u'Id', u'11111'), 
      (u'Subject', u'Case 1') 
      ]), 
     OrderedDict([ 
      (u'attributes', OrderedDict([ 
       (u'type', u'Case'), 
       (u'url', u'/services/Case/2222222') 
       ])), 
      (u'Id', u'2222222'), 
      (u'Subject', u'Case 2') 
      ]), 
     #... 
     ]) 
    ]) 

내가 올바른 용어 목록을 가지고,하지만 난의 형태로 다차원 테이블로 원하는 I 확실하지 :

[('11111', 'Case 1'),('2222222', 'Case 2')] 

궁극적으로이 목록을 다른 목록과 결합하려고합니다. 이것이 데이터를 설정하는 가장 좋은 방법입니까? 나는 내부 싶습니다

그래서 두 목록이 될 것 가입 :

목록 1 :

List1 = [('11111', 'Case 1'),('2222222', 'Case 2')] # [ID, Subject] 

목록 2 :

List2 = [('11111', 'April'),('2222222', 'March'),('333333', 'January')] # [ID, Date] 

원하는 출력 :

[('11111', 'Case 1','April'),('2222222', 'Case 2','March')] 
+0

당신이 직접 시도한 것을 보여줄 수 있습니까? – Kasramvd

+0

너무 많이 시도했습니다. 파이썬에 익숙하지 않고 다소 압도적입니다. – user2242044

+0

어디에서 시작해야할지 모르겠 음 – user2242044

답변

2

당신은 사용하여 두 차원 테이블을 얻을 수있는 list comprehension :

from collections import OrderedDict 

od = OrderedDict([ 
     (u'totalSize', 418), 
     (u'done', True), 
     (u'records', [ 
      OrderedDict([ 
       (u'attributes', OrderedDict([ 
            (u'type', u'Case'), 
            (u'url', u'/services/Case/11111') 
            ])), 
       (u'Id', u'11111'), 
       (u'Subject', u'Case 1') 
       ]), 
      OrderedDict([ 
       (u'attributes', OrderedDict([ 
            (u'type', u'Case'), 
            (u'url', u'/services/Case/2222222') 
            ])), 
       (u'Id', u'2222222'), 
       (u'Subject', u'Case 2') 
       ]), 
      #... 
      ]) 
     ]) 

list1 = [(record['Id'], record['Subject']) for record in od['records']] 
print list1 # -> [(u'11111', u'Case 1'), (u'2222222', u'Case 2')] 

에 "내부 조인은"이 같은 코드 뭔가 모방 할 수 :

list2 = [('11111', 'April'), ('2222222', 'March'), ('333333', 'January')] 

joined = [item1+item2[1:] for item1 in list1 
          for item2 in list2 
           if item1[0] == item2[0]] 

print joined # -> [(u'11111', u'Case 1', 'April'), 
       #  (u'2222222', u'Case 2', 'March')] 

참고 : 후자를 다소 비효율적이므로 대형 데이터 세트를 신속하게 처리하기 위해 고급 처리 기술 및/또는 데이터 구조를 사용하고자 할 수 있습니다.

2

당신이 가지고있는 것은 dict tha입니다. 다른 것들 중에서도 다른 dicts를 포함합니다. 원하는 출력을 외삽하면이 데이터 구조를 IdSubject을 포함하는 최상위 수준 records 키 아래의 각 요소로 변환 할 수 있습니다.

이제 요구 사항을 정의 했으므로 해결책은 쉽게 나타납니다. records 목록을 반복하고 원하는 속성을 포함하는 튜플을 만듭니다. 최상위 객체가 data이라고 가정 해 보겠습니다. 그런 다음 : 당신이 기본 개념에 익숙해있어되면

output = [] 
for record in data['records']: # Loop over all the records (each one an OrderedDict) in the list 
    subject = record['Subject'] # Extract the required information 
    identifier = record['Id'] 
    output.append((identifier, subject)) # Add the extracted info to the output list 

print(output) # Prints: [('11111', 'Case 1'), ('2222222', 'Case 2')] 

, 당신은 실제로 당신의 입력이 큰 경우 만들 훨씬 더 빨리 할 수있는 지능형리스트,에,이 루프를 축소 할 수 있습니다. 다음 줄은 위의 루프와 동일하지만 읽기 쉽도록되어 있습니다 (어쨌든 Python 구조체에 익숙한 사용자).

output = [(record['Id'], record['Subject']) for record in data['records']]