2017-05-03 12 views
0

辞書のリストはJSONから変換されていますが、辞書のキーにアクセスするのが難しいUnicodeのキーはほとんどありません。リストは次のようになります。今辞書と文字列のリストを繰り返します。

d = [{'location': u'', 
     'partner_id': '648746', 
     'partner_is_CSP': 'Y', 
     'partner_name': 'D4T4 SOLUTIONS PLC', 
     'partner_programs_tiers': [{'program_name': 'Cloud Service Provider', 
     'tier_name': 'Gold'}], 
     'partner_type': 'Direct Reseller; Service Provider', 
     'sort_value': '60', 
     'url_to_logo': u'', 
     'url_to_website': 'https://www.d4t4solutions.com/'}, 
    {'location': {'address_type': 'H', 
     'city': 'Tirane', 
     'country': 'ALBANIA', 
     'geo_latitude': '41.348335', 
     'geo_longitude': '19.79865', 
     'phone': u'', 
     'point_of_contact': u'', 
     'state': u'', 
     'street_1': 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE', 
     'street_2': u'', 
     'street_3': u'', 
     'zip': '1023'}, 
     'partner_id': '649341', 
     'partner_is_CSP': 'N', 
     'partner_name': 'COMMUNICATION PROGRESS', 
     'partner_programs_tiers': '[]', 
     'partner_type': 'Distribution VAR', 
     'sort_value': '0', 
     'url_to_logo': u'', 
     'url_to_website': 'www.commprog.com'}] 

、私はこのような何かやりたい:

l = [i["location"].get("street_1",None) for i in d] 

をしかし、私は次のエラーを取得しています:

AttributeError: 'Unicode' object has no attribute 'get' 

私は働くことができる方法そのユニコードの周りに私の方法?あなたの助けに感謝します。

P.S.リストdにはここに示したものより多くの辞書が含まれており、それにはただ1つ以上のUnicodeが含まれています。辞書を繰り返すと、空のUnicode値を持つ位置キーの値がNoneになります。

答えて

1

あなたはこの(かなり読めない)ワンライナー使用することができます:それは一緒に行くために、おそらく良いでしょう

>>> [r['location'].get('street_1', None) if isinstance(r['location'], dict) else (r['location'] or None) for r in d] 
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE'] 

をフルforループ:

>>> l = [] 
>>> for r in d: 
...  loc = r['location'] 
...  if isinstance(loc, dict): 
...   l.append(loc.get('street_1', None)) 
...  else: 
...   l.append(loc or None) 
... 
>>> l 
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE'] 
>>> 

基本的に、あなたかどうかを確認するためにisinstanceを使用dictで作業しているかどうか。もしそうなら、.getを使用してください。そうでない場合は、値を追加してください。 locが真実でない場合、私はloc or NoneNoneと評価します。u""は真実ではありません。それで行くかLBYLアプローチは、データの性質に依存する方が効率的であるかどうかは

>>> for r in d: 
...  loc = r['location'] 
...  try: 
...   l.append(loc.get('street_1', None)) 
...  except AttributeError: 
...   l.append(loc or None) 
... 
>>> l 
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE'] 

代替はEAFPアプローチです。 「例外」が本当に例外的でない場合、すなわち頻繁に発生する場合、EAFPがPythonicとみなされても、LBYL手法は実際にはより高速になる。

+0

このような包括的な説明とトリックに感謝します。乾杯! –

0

として簡単な方法は、次のようになります。

for i in d: 
    location = i['location'] 
    if location: 
     print(location.get('street_1', 'n/a')) # or whatever you want to do... 
+0

大変ありがとう@martineau –

1

は単にデフォルトとして空の辞書を使用して、少しあなたの試みを変更します。

+0

ありがとう@stefan –

+0

こんにちは@Stefan Pochmann:ちょっとした質問ですが、これはどのように機能するのですか? –

+0

@KrishnangDalal説明する内容がわかりません。これはあなたのものと同じですが、 'i [" location "]'が偽の場合を除き、代わりに空のdictが使われます。たぶん[ブール演算のドキュメント](https://docs.python.org/2/reference/expressions.html#boolean-operations)を読む必要がありますか? –

関連する問題