2

This is probably a very basic question, but I looked through the python documentation on exceptions and couldn't find it.

I'm trying to read a bunch of specific values from a dictionary and insert slices of these into another dictionary.

for item in old_dicts:
    try:
        new_dict['key1'] = item['dog1'][0:5]
        new_dict['key2'] = item['dog2'][0:10]
        new_dict['key3'] = item['dog3'][0:3]
        new_dict['key4'] = item['dog4'][3:11]
    except KeyError:
        pass

Now, if Python encounters a key error at ['dog1'], it seems to abort the current iteration and go to the next item in old_dicts. I'd like it to go to the next line in the loop instead. Do I have to insert an exception instruction for each row?

4

5 に答える 5

1

それを関数にします:

def newdog(self, key, dog, a, b)
    try:
        new_dict[key] = item[dog][a:b]  
    except KeyError:
        pass

私は上記のコードを実行しませんでしたが、モジュール化のようなものは機能するはずです。または、すべての値をチェックし、辞書にないすべての値を削除するように準備することもできますが、それはおそらく各行の例外よりも多くのコードになります。

于 2013-06-12T05:45:55.720 に答える
1

キーの値が有効であることがわかっていると仮定すると、例外をすべて無視してキーをチェックしてみませんか?

for item in old_dicts:
    if 'dog1' in item:
        new_dict['key1'] = item['dog1'][0:5]
    if 'dog2' in item:
        new_dict['key2'] = item['dog2'][0:10]
    if 'dog3' in item:
        new_dict['key3'] = item['dog3'][0:3]
    if 'dog4' in item:
        new_dict['key4'] = item['dog4'][3:11]
于 2013-06-12T06:11:00.350 に答える
1
for item in old_dicts:
    for i, (start, stop) in enumerate([(0,5), (0,10), (0,3), (3,11)], 1):
        try:
            new_dict['key' + str(i)] = item['dog' + str(i)][start:stop]
        except KeyError:
            pass
于 2013-06-12T05:46:32.407 に答える
0

はい、そうします。tryベスト プラクティスは、ブロックをできるだけ小さく保つことです。tryブロック内には、例外が発生する可能性があるコードのみを記述してください。elsefor the tryandステートメントもあることに注意してください。これはexcept、try が例外なく実行された場合にのみ実行されます。

try:
    // code that possibly throws exception
except Exception:
    // handle exception
else:
    // do stuff that should be done if there was no exception
于 2013-06-12T05:52:37.037 に答える
0

そうです。面倒で見にくいですが、呼び出しごとに例外ハンドラーが必要です。


とはいえ、コードを少し異なる方法で記述して、自分の生活を楽にすることができます。このことを考慮:

def set_new_dict_key(new_dict、キー、アイテム、パス):
    試す:
        パス内の path_item の場合:
            アイテム = アイテム[パス_アイテム]
    KeyError を除く:
        合格
    そうしないと:
        new_dict[キー] = アイテム

old_dicts のアイテムの場合:
    set_new_dict_key(new_dict, 'key1', item, ['dog1', slice(0, 5)])
    set_new_dict_key(new_dict, 'key2', item, ['dog2', slice(0, 10)])
    set_new_dict_key(new_dict, 'key3', item, ['dog3', slice(0, 3)])
    set_new_dict_key(new_dict, 'key4', item, ['dog4', slice(3, 11)])
于 2013-06-12T05:47:29.703 に答える