2012-02-17 10 views
1

ここに私の問題があります:リストがリストでない場合、リストの最初の要素を取得します。

私はPythonでLDAP検索を行っています。検索によって辞書オブジェクトが返されます。

{'mail':['[email protected]'],'mobile':['07852242242'], 'telephoneNumber':['01112512152']} 

ご覧のとおり、返された辞書にはリスト値が含まれています。

時々、何の結果は見つかりません:

{'mail':None, 'mobile':None, 'telephoneNumber':['01112512152']} 

は、辞書項目が存在しない場合は、例外を避けるために、私は、get()を使用しています、必要な値を抽出します。

return {"uname":x.get('mail')[0], "telephone":x.get('telephoneNumber')[0], "mobile":x.get('mobile')[0]} 

私は単なる文字列値で、上記のように自分の辞書を返すようにしたいが、Imはリストはどれもないではないことを確認し、インデックス・エラーやタイプミスに稼働を維持するための効率的な方法を見つけるのに苦労:

(<type 'exceptions.TypeError'>, TypeError("'NoneType' object is unsubscriptable",) 

リストにget()メソッドを使用する方法があるので、リストがNoneの場合は例外がスローされません???

{"uname":x.get('mail').get(0)} 

リストの最初の値を取得または使用せずにNoneを返さないの最も効率的な方法は何ですか:

if isinstance(x.get('mail'),list): 

または

if x.get('mail') is not None: 

答えて

3

あなたの辞書を平らにしたい場合は、あなただけで行うことができます。

>>> d = {'mail':None, 'mobile':None, 'telephoneNumber':['01112512152']} 
>>> 
>>> dict((k,v and v[0] or v) for k,v in d.items()) 
{'mail': None, 'mobile': None, 'telephoneNumber': '01112512152'} 

あなたも、あなたが行うことができ、None値を遮断、フィルタリングしたい場合:

>>> dict((k,v[0]) for k,v in d.items() if v) 
{'telephoneNumber': '01112512152'} 
+0

非常にいい、ありがとう – rslnx

+0

これは私が必要としていたものです、私は誰かが私のニーズに合ったものを構築することができなかったので、リストやディクテーションの理解を思いつくことを望んでいた!ありがとう! – JackalopeZero

0

あなたはこのような何かを行うことができます:

input_dict = {'mail':None, 'mobile':None, 'telephoneNumber':['01112512152']} 

input_key_map = { 
    'mail': 'uname', 
    'telephoneNumber': 'telephone', 
    'mobile': 'mobile', 
} 

dict((new_name, input_dict[old_name][0]) 
     for old_name, new_name in input_key_map.items() if input_dict.get(old_name)) 

# would print: 
{'telephone': '01112512152'} 
0

そこにこれを行うための簡単な方法ですが、あなたは試すことができます:

default_value = [None] 
new_x = dict((k, default_value if not v else v) for k, v in x.iteritems()) 

そしてnew_xの代わりxを使用しています。

2

は、次を試してみてください。

return {"uname":(x.get('mail') or [None])[0], ... 

それは少し読めないので、あなたはおそらく、いくつかのヘルパー関数にそれをラップします。

+0

私は同じことを持っていましたが、 'get()'はキーが見つからなければデフォルト値を返し、キーには 'None'という値がない場合は返しません。 – soulcheck

+0

@JackalopeZeroええ、それは逃しました。編集を参照してください。 –

+0

暗黙のbooleannessの良い使用 – soulcheck

関連する問題