0

入力の検証、特に提供されたデータに必要な属性がすべて指定されているかどうかを確認し、不要な属性を破棄しながら、次のようにしました。

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> print input
{'v1': 'val1', 'a3': 'val3', 'a2': 'val2'}
>>> goodkeys = ['a2', 'a3']
>>> print goodkeys
['a2', 'a3']
>>> output = {}
>>> for a in goodkeys:    
...   output[a] = input[a]
... 
>>> 
>>> print output
{'a3': 'val3', 'a2': 'val2'}

もちろん、これは機能します。しかし、これをよりPython的な方法で行うことができるかもしれないと思いました。私は試した:

>>> output = {}
>>> print output
{}
>>> output = { a:v for a in goodkeys for v in input[a] }
>>> print output
{'a3': '3', 'a2': '2'}
>>> 

0.5 秒間うまくいったと思っていたのですが、値が間違っていることに気付きました。きれいなPythonメソッドはありますか? では、Python はこれらの値をどこで取得したのでしょうか。

4

3 に答える 3

3

ディクショナリ ビュー オブジェクトを使用できます。

goodkeys = {'a2', 'a3'}
output = {a: input[a] for a in input.viewkeys() & goodkeys}

goodkeys集合です。dict.viewkeys()辞書の内容を反映するセットのようなオブジェクトを生成し、それらのキーとセット& goodkeysの間の共通部分を生成します。goodkeysそうすれば、入力辞書と適切なキーのセットの両方にあるキーのみを生成できます。

次のようなネストされたループを作成しました。

for a in goodkeys:
    for v in input[a]:
        # v is a single character in the string value

デモ:

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> goodkeys = {'a2', 'a3'}
>>> {a: input[a] for a in input.viewkeys() & goodkeys}
{'a3': 'val3', 'a2': 'val2'}

は文字列であるためinput[a]、内側のループによって各値の個々の文字が生成されます。

>>> for a in goodkeys:
...     for v in input[a]:
...         print a, v
... 
a3 v
a3 a
a3 l
a3 3
a2 v
a2 a
a2 l
a2 2

キーは一意である必要があるためa2、 、valおよびのいずれか2が選択され、その他は破棄されます。辞書内包表記は'a2': 'v'、最初に 、次になどを設定し、最終的に出力に残る'a2': 'a'だけです。'a2': '2'

その内側のループを使用する必要はありませんでした。あなたは固執することができました:

{a: input[v] for a in goodkeys}

ただし、含まれgoodkeysていないキーが含まれているinput場合は、KeyError. ディクショナリ ビュー アプローチは、この問題をうまく回避します。

于 2014-12-12T16:20:47.863 に答える
0

あなたはこれを考え過ぎているかもしれません。変えてみてください

output = { a:v for a in goodkeys for v in input[a] }

単純に...

output = { a:input[a] for a in goodkeys }
于 2014-12-12T16:23:33.723 に答える
0
output = { a:input[a] for a in goodkeys }

2番目forは、文字列値の文字を反復処理します。

于 2014-12-12T16:20:44.513 に答える