2017-12-05 15 views
0

다음과 같이 사전 (result_dict)이 있습니다.사전 반복 및 값 추출

{'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '1', 
    'iconfarm': 3, 
    'iconserver': '2214', 
    'id': '[email protected]', 
    'ispro': 0, 
    'location': {'_content': ''}, 
    'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'}, 
    'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'}, 
    'nsid': '[email protected]', 
    'path_alias': 'kishansamarasinghe', 
    'photos': {'count': {'_content': 442}, 
    'firstdate': {'_content': '1193073180'}, 
    'firstdatetaken': {'_content': '2000-01-01 00:49:17'}}, 
    'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'}, 
    'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'}, 
    'realname': {'_content': 'Kishan Samarasinghe'}, 
    'timezone': {'label': 'Sri Jayawardenepura', 
    'offset': '+06:00', 
    'timezone_id': 'Asia/Colombo'}, 
    'username': {'_content': 'Three Sixty Five Degrees'}}, 
    'stat': 'ok'}, 
'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '0', 
    'iconfarm': 1, 
    'iconserver': '404', 
    'id': '[email protected]', 
    'ispro': 0, 
    'location': {'_content': 'Almere, The Nederlands'}, 
    'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'}, 
    'nsid': '[email protected]', 
    'path_alias': 'meijsvo', 
    'photos': {'count': {'_content': 3237}, 
    'firstdate': {'_content': '1392469161'}, 
    'firstdatetaken': {'_content': '2013-06-23 14:39:30'}}, 
    'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'}, 
    'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'}, 
    'realname': {'_content': 'Markéta Eijsvogelová'}, 
    'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna', 
    'offset': '+01:00', 
    'timezone_id': 'Europe/Amsterdam'}, 
    'username': {'_content': 'meijsvo'}}, 
    'stat': 'ok'}, 
'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '1', 
    'iconfarm': 0, 
    'iconserver': '0', 

여기에는 15035 개 이상의 사용자 이름 (e.g. [email protected])이 포함되어 있습니다. 각 사용자에 대해 'mobileurl'을 추출하고 usernamemobileurl 열을 포함하는 데이터 프레임을 생성합니다. 색인 생성이 불가능하므로 각 사용자를 반복하고 그의 mobileurl을 추출 할 수있는 방법을 찾지 못했습니다. 그러나, 나는 다음과 같이 사용자 중 하나에 대한 mobileurl을 추출했습니다. 누군가가 도울 수 있다면 내가 파이썬에 약간의 새로 온 사람으로

result_dict['[email protected]']["person"]["mobileurl"]['_content'] 

'https://m.flickr.com/photostream.gne?id=76524249' 

는 감사 드리겠습니다. 이 경우 사용자 이름입니다 키의 dictionarys의 목록을

+0

"result_dict.keys()"의 사용자는 모든 사용자에 대해 반복합니다 – Ora

+0

실제로 json을 우리가 직접 시설에로드 할 수 있도록 게시해야합니다. 귀하의 경우 팬더입니다. – stucash

+0

'for 루프'를 사용하여 사전을 반복 할 수 있습니다. (https://stackoverflow.com/questions/3294889/iterating-over-dictionaries-using-for-loops) – drhagen

답변

0

반복 처리는 각 최상위 딕셔너리에 액세스하는 각 하나를 사용하고 거기에서 당신이 필요로하는 정확한 데이터를 찾기 위해 다른 모든 레이어를 통해 다이빙. 당신의 모범 사례.

일단이 두 변수가 있으면 데이터 프레임에 추가하십시오. 더 나은 사용 사례를 들어

# Iterate through list of users 
for user in result_dict.keys(): 

    # use each username to find the mobileurl you need within 
    mobileurl = result_dict[user]["person"]["mobileurl"]["_content"] 

    # Add the variables 'user' and 'mobileurl' to dataframe as you see fit 
+0

@loki 확실히, 편집 – SamC

+0

@SamC, thanks 귀하의 발췌 문장에서 나는 그것을 시도하고 그것을 데이터 프레임에 추가했습니다. stucash가 제안한 것처럼 그것은 가장 효율적인 것입니다. – Tharindu

0
result_dict = {'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '1', 
    'iconfarm': 3, 
    'iconserver': '2214', 
    'id': '[email protected]', 
    'ispro': 0, 
    'location': {'_content': ''}, 
    'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'}, 
    'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'}, 
    'nsid': '[email protected]', 
    'path_alias': 'kishansamarasinghe', 
    'photos': {'count': {'_content': 442}, 
    'firstdate': {'_content': '1193073180'}, 
    'firstdatetaken': {'_content': '2000-01-01 00:49:17'}}, 
    'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'}, 
    'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'}, 
    'realname': {'_content': 'Kishan Samarasinghe'}, 
    'timezone': {'label': 'Sri Jayawardenepura', 
    'offset': '+06:00', 
    'timezone_id': 'Asia/Colombo'}, 
    'username': {'_content': 'Three Sixty Five Degrees'}}, 
    'stat': 'ok'}, 
'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '0', 
    'iconfarm': 1, 
    'iconserver': '404', 
    'id': '[email protected]', 
    'ispro': 0, 
    'location': {'_content': 'Almere, The Nederlands'}, 
    'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'}, 
    'nsid': '[email protected]', 
    'path_alias': 'meijsvo', 
    'photos': {'count': {'_content': 3237}, 
    'firstdate': {'_content': '1392469161'}, 
    'firstdatetaken': {'_content': '2013-06-23 14:39:30'}}, 
    'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'}, 
    'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'}, 
    'realname': {'_content': 'Markéta Eijsvogelová'}, 
    'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna', 
    'offset': '+01:00', 
    'timezone_id': 'Europe/Amsterdam'}, 
    'username': {'_content': 'meijsvo'}}, 
    'stat': 'ok'}, 
'[email protected]': {'person': {'can_buy_pro': 0, 
    'description': {'_content': ''}, 
    'has_stats': '1', 
    'iconfarm': 0, 
    'iconserver': '0'} 
} 
} 

사전 iteritems()를 사용 :

for key, value in result_dict.iteritems(): 
    print value.get("person", {}).get("mobileurl", {}).get("_content") 

OUTPUT을 당신도의이 더 많은 일을 시도 할 수 있다고 생각

https://m.flickr.com/photostream.gne?id=117600164 
https://m.flickr.com/photostream.gne?id=11327876 
+0

죄송합니다. 내가 프록시를 사용하고 있는데 그의 json 샘플 데이터를 성공적으로로드 한 결과를 볼 수 없습니까? – stucash

+0

그의 json이 잘못되었습니다. 마지막으로 ','을 제거하고 마지막으로 json에서 '}}'을 추가해야합니다. 덕분에 –

+0

은 이미 작동하지 않습니다. 마지막으로 불완전한 사용자 섹션을 제거하십시오. – stucash

0

순수한 사전 반복 대신 팬더 방식. 그것은 반드시 가장 빠를 필요는 없지만 당신이 파이썬과 팬더에 익숙하지 않다면 팬더가 이것을 잘 처리 할 수 ​​있다는 것을 아는 것은 좋은 일이라고 생각합니다.

사전이 아닌 팬더 DataFrame을 사용하고 있다고 가정합니다. json을 팬더로 변환하지 않고도 동일한 목적을 쉽게 달성 할 수 있습니다 DataFrame. 즉, 팬더가 아니더라도 다른 답변도 사용할 수 있습니다. DataFrame. 그들은 또한 유효한 파이썬 사전 구문입니다.

urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content']) 

여기에서 우리는 person으로 인덱스가 모든 행을 선택한 후, 우리는 각 person에 (람다 우리가 사용하게 될 익명 함수) apply에 함수를 시도했다. 이 경우 lambda 함수를 사용하여 URL을 추출한 다음 팬더는 결과를 팬더 DataFrame (또는 Series)으로 다시 변환합니다.

일반적으로 내 반복이 얼마나 빠른지 신경 써야합니다.

(IPython에서 수행되는 다음, 멋진 도구를 사용하면 파이썬에서 많은 일을 사용할 수 있습니다. %% timeit 당신이 당신의 코드가 취할 수있는 시간을 계산할 IPython에서 제공하는 마법 기능입니다)

%timeit 
urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content']) 

1000 loops, best of 3: 133 us per loop (us = microsecond, 10e-6) 

@SamC이 빠른 해결책을 제공해 드리며 알려 드리겠습니다. 하지만 내가 말했듯이 그의 솔루션을 사용하려면 DataFrame이 필요하지 않습니다. 일반 사전에도 사용할 수 있습니다.