2

私はその中にdict別のものを含んでいますdict

d1 = {'a':{'p':1, 'q':2, 'r':'abc'}, 
      'b':{'p':5, 'q':6, 'r':["google", "pypi.org"]}
     }
url1 = "https://google.com"
url2 = "https://abc.com"

今私がやりたいことはr、両方からの値のチェックを実行することですが、コードの冗長性は必要ありません。それはどのように可能ですか?dict values

私が今していることは:-

for k, v in d1.iteritems():
    if isinstance(v['r'], list):
        for l in v['r']:
            if url1.find(l):
                ..Do something..
            else:
                continue
    else:
        if url1.find(v['r'):
                ..Do Something same as above..
            else:
                continue

Do something 同じことを 2 回繰り返すと問題が発生します。関数の作成と呼び出しを除いて、理解または他の方法で冗長性を解決する方法はありますか。

編集 - コードは既に大きな関数定義内にあるため、別の関数を作成して呼び出す以外の解決策を提供してください。

4

3 に答える 3

1

フリーキッシュは正しいです。ここでは、関数を使用するのが最善の解決策です。関数呼び出しを使用するオーバーヘッドはごくわずかであり、新しいリストを作成して長さ 1 のリストをループするよりもおそらく少ないでしょう。

ただし、どうしてもコードの重複を避け、複数の関数呼び出しを避けたい場合は、コードをジェネレーター関数に書き直すことを検討してください。これにより、一度に 1 つずつ処理するアイテムが生成されます。

def loop(d1):
    for k, v in d1.iteritems():
        if isinstance(v['r'], list):
            for l in v['r']:
                if url1.find(l):
                    yield l
                else:
                    continue
        else:
            if url1.find(v['r']):
                yield v['r']
            else:
                continue

for item in loop(d1):
    print "do something"
于 2014-05-29T09:53:42.490 に答える