0

背景: 素敵な形式で印刷するために繰り返し処理しているハッシュがあります。

サンプルハッシュ

Final = {
    'sf_market_flash_subscribers': [
        {'38': './BLMetricsSql.sql'}
    ], 
    'vw_owner_product_bls_only': [
        {'31': './BLMetricsSql.sql'}, 
        {'39': './BLMetricsSql.sql'}, 
        {'62': './BLMetricsSql.sql'}, 
        {'64': './BLMetricsSql.sql'}
    ]
}

マイコード

def printFinal(final):
    for key, value in final.iteritems():
        print key
        print value
        line_num=""
        path=""
        uniqueTables=[]
        for line_and_path in value:
            path=line_and_path.values()[0]
            uniqueTables.append(path)
            print uniqueTables
    print uniqueTables
    uniqueTables=list(set(uniqueTables))
    print uniqueTables
    for unique_path in uniqueTables:
        print unique_path
        for line_and_path in value:
            if line_and_path.values()[0]==unique_path.rstrip():
                line_num = line_and_path.keys()[0]
                print line_num

上記コードの出力

sf_market_flash_subscribers
[{'38': './BLMetricsSql.sql'}]
['./BLMetricsSql.sql']
vw_owner_product_bls_only
[{'31': './BLMetricsSql.sql'}, {'39': './BLMetricsSql.sql'}, {'62': './BLMetricsSql.sql'}, {'64': './BLMetricsSql.sql'}]
['./BLMetricsSql.sql']
['./BLMetricsSql.sql', './BLMetricsSql.sql']
['./BLMetricsSql.sql', './BLMetricsSql.sql', './BLMetricsSql.sql']
['./BLMetricsSql.sql', './BLMetricsSql.sql', './BLMetricsSql.sql', './BLMetricsSql.sql']
['./BLMetricsSql.sql', './BLMetricsSql.sql', './BLMetricsSql.sql', './BLMetricsSql.sql']
['./BLMetricsSql.sql']
./BLMetricsSql.sql
31
39
62    
64

出力の最初の 4 行を見てください

ループは、1 行目と 2 行目にキーと値をそれぞれ出力します。次に、ループ内の一意のテーブルの現在の状態を出力します。その後、BOOM 残りのすべてのコードは実行されず、最後の要素の 2 番目の要素をループします。 vw_owner_product_bls_only をハッシュしてから実行を開始します。ただし、この要素では、内側のループの後のすべてのコードが実行され、目的の出力が得られます。

では、最終的なハッシュの最初の要素に対してのみ残りのコードが実行されないのはなぜでしょうか? ハッシュの値に要素が 1 つしかないためですか?

4

2 に答える 2

1

インデントが正しくないためです。コードをループ内で実行する場合は、ループを開始するステートメントよりもさらにインデントする必要があります。

于 2012-12-11T18:01:51.497 に答える
0

You initialise uniqueTables every time round the loop, so the code outside the loop only sees the most recent value, which is the second element. The initialisation needs to be at the outermost level:

def printFinal(final):
    uniqueTables = []
    for key, value in final.iteritems():
        # etc
    print uniqueTables
    uniqueTables=list(set(uniqueTables))
    # etc
于 2012-12-11T18:18:34.777 に答える