2017-09-24 19 views
0

辞書の1つのキーからの値としてリストをフィルタリングし、リストの要素をintに変換したいと思います。リストの要素は"または... 私は次のようにいくつかの愚かなコードを持っているかもしれませんが、どのようにそれを行うためにもっとpythonicや1行を持つことができますか?dict内のリストの特定の要素をフィルタ

def fil(d:dict): 
    rtn = dict() 
    for k, v in d.items(): 
     rtn[k] = [int(x) for x in v if x and x != '...'] 
    return rtn 

d = dict(name=['1', '2', '3', '4', '5'], state=['21', '', '22', '...', '23'], number=['11', '...', '12', '13']) 
print(fil(d)) 
+1

あなたが持っているものは問題ありません。変更が必要なのは、その場で動作し、値を返さないか、コピーを作成して返すことだけです。その場で変更したり、*オブジェクトを返さないでください。 – wim

+0

私は更新したものが好きですか?空の辞書を作成して返しますか? – jacobcan118

答えて

0

あなたは確かに辞書の理解だけでなく、リストの内包表記を使用することにより、1つのラインにそれを減らすことができます

{k:[int(x) for x in v if x and x != '...'] for k,v in d.items()} 

代替機能としてちょうどリスト変換を定義し、書くことだろう{k:fil(v) for k,v in d.items()}は、分離可能な辞書とリストの取り扱いを示しています(そして、口一杯のように感じることはありません)。

0

あなたが「ピジョンソニック」のやり方を探しているなら、私はあなたが持っているものはいいと言うでしょう。

あなたはワンライナーを探しているなら、おそらく:

>>> def fil(d): 
     return {k: [int(x) for x in v if x and x != '...'] for k, v in d.items()} 

>>> d = dict(name=['1', '2', '3', '4', '5'], state=['21', '', '22', '...', '23'], number=['11', '...', '12', '13']) 
>>> print (fil(d)) 
{'name': [1, 2, 3, 4, 5], 'state': [21, 22, 23], 'number': [11, 12, 13]} 
>>> 

これはダウンに来ることは、あなたが「神託」として定義しているものです。理解は一般的にはかなり「ピジョンソニック」と考えられており、これは辞書comprehnsion内のリストの理解です!

つまり、関数がPEP標準を満たしていれば、構文的に正解であり、他のプログラマーがその目的を確かめるために簡単に見直すことはできません。

あなたのパラメータにtypingの構文を使用するように押されていない限り、それを削除してください。

関連する問題