3

これを行う簡単な方法があるかどうか疑問に思っていました。ファイルから解析される特定の構造があり、出力は辞書のリストの辞書のリストです。現在、次のようなコードが少しあります。

for i in xrange(len(data)):
    for j, k in data[i].iteritems():
        for l in xrange(len(data[i]['data'])):
            for m, n in data[i]['data'][l].iteritems():
                dostuff()

構造をトラバースし、各エントリがリストまたは辞書であるかどうかを内部的に把握し、それが辞書である場合はその辞書にトラバースするなどの機能があるかどうかを知りたかっただけです。私は Python を使い始めて約 1 か月ほどしか経っていないので、決してこの言語の専門家でも中級者でもありません。回答ありがとうございます。

編集:コードを単純化することができたとしても、それは役に立ちます。

4

4 に答える 4

10

を繰り返す必要はありませxrange(len(data))data(リストの場合)またはdata.items()(またはvalues())(dictの場合)のいずれかを繰り返します。

コードは次のようになります。

for elem in data:
    for val in elem.itervalues():
        for item in val['data']:

これはかなり短いです。

于 2013-06-06T17:04:35.653 に答える
5

配列/ハッシュのものの任意の構造を決定しようとしている場合は、関数に基づいてそれを行う関数を作成できますtype()

def traverse_it(it):
    if (isinstance(it, list)):
        for item in it:
            traverse_it(item)
    elif (isinstance(it, dict)):
        for key in it.keys():
            traverse_it(it[key])
    else:
        do_something_with_real_value(it)

平均的なオブジェクト指向の第一人者は、これを行わないように指示することに注意してください。代わりに、1 つが配列に基づいており、もう 1 つが dict に基づいており、同じ関数名でそれぞれを処理する単一の関数を持っているクラス ツリーを作成します (つまり、仮想関数) を呼び出し、各クラス関数内でそれを呼び出します。IE、タイプに基づく if/else ツリーは「悪い」です。独自の方法でコンテンツを処理するためにオブジェクトに対して呼び出すことができる関数。

于 2013-06-06T17:09:37.727 に答える
1

これがあなたがやろうとしていることだと思います。リストの各値を反復処理するxrange()ため、リストからインデックスを引き出すために使用する必要はありません。したがって、以下の私の例では、現在の への参照です。ford1data[i]

for d1 in data: # iterate over outer list, d1 is a dictionary
    for x in d1: # iterate over keys in d1 (the x var is unused)
        for d2 in d1['data']: # iterate over the list

            # iterate over (key,value) pairs in inner most dict
            for k,v in d2.iteritems():
                dostuff()

また、名前をl2 回 (意図的かどうかに関係なく) 使用していますが、スコープがどのように機能するかに注意してください。

于 2013-06-06T17:09:06.003 に答える
0

まあ、質問はかなり古いです。しかし、私の好奇心から、私が試したより良い答えを求めてあなたの質問に答えたいと思います. 辞書が次のようになっているとします。dict1 = { 'a':5,'b': [1,2,{'a':100,'b':100}], 'dict 2' : {'a':3,'b':5}}

解決: dict1 = { 'a':5,'b': [1,2,{'a':100,'b':100}], 'dict 2' : {'a':3,'b':5}} def recurse(dict): if type(dict) == type({}): for key in dict: recurse(dict[key]) elif type(dict) == type([]): for element in dict: if type(element) == type({}): recurse(element) else: print element else: print dict recurse(dict1)

于 2015-08-28T09:21:48.367 に答える