2017-02-06 6 views
0

strのすべてのインスタンスをdictsおよびリストのネストされたデータ構造内で検索します。すべての端末項目がstrになるわけではありません。ジェネレータを使用して、任意のネストされた特定のオブジェクトタイプの出現を任意のネストで見つけることができます。

データ例:

data = {'iso_seq_bams': [['5/X/tmp2oWhu5.tmp', 'y/H/tmp6Po0_X.tmp']], 
     'annotation': None, 
     'bams': {'BAM': {'ERR579132Aligned.sortedByCoord.out.bam': ['Y/o/tmpntzREn.tmp', 'z/c/tmp6DmQhS.tmp']}, 
       'INTRONBAM': {}}} 

と期待される結果は、このように['5/X/tmp2oWhu5.tmp', 'y/H/tmp6Po0_X.tmp', 'Y/o/tmpntzREn.tmp', 'z/c/tmp6DmQhS.tmp']

だろう私は、再帰的な方法でこれを実装しようと試みてきたが、動作するようには思えません。結果は現在、空のリストです。

def descend_object(obj): 
    if isinstance(obj, dict): 
     for item in obj.values(): 
      descend_object(item) 
    elif isinstance(obj, list): 
     for item in obj: 
      descend_object(item) 
    elif isinstance(obj, str): 
     yield obj 
+0

あなたはから 'yield'する必要性をあなたの再帰呼び出し –

+0

はhttp://stackoverflow.com/questions/10569636/how-to-get-all-keysvalues-in-nested-dict-of-list-of-dicts-and-dicts?rq=1に関連しています – Arman

+0

降伏再帰呼び出しからのリード実際に結果を平坦化することなく、ネストされたジェネレータのグループに返す –

答えて

3

のPython 2には、手動で再帰呼び出し反復処理する必要がある場合はPython 3に、yield from

In [3]: def descend_object(obj): 
    ...:  if isinstance(obj, dict): 
    ...:   for item in obj.values(): 
    ...:    yield from descend_object(item) 
    ...:  elif isinstance(obj, list): 
    ...:   for item in obj: 
    ...:    yield from descend_object(item) 
    ...:  elif isinstance(obj, str): 
    ...:   yield obj 
    ...: 

In [4]: list(descend_object(data)) 
Out[4]: 
['Y/o/tmpntzREn.tmp', 
'z/c/tmp6DmQhS.tmp', 
'5/X/tmp2oWhu5.tmp', 
'y/H/tmp6Po0_X.tmp'] 

を使用する場合:

In [6]: def descend_object(obj): 
    ...:  if isinstance(obj, dict): 
    ...:   for item in obj.values(): 
    ...:    for d in descend_object(item): 
    ...:     yield d 
    ...:  elif isinstance(obj, list): 
    ...:   for item in obj: 
    ...:    for d in descend_object(item): 
    ...:     yield d 
    ...:  elif isinstance(obj, str): 
    ...:   yield obj 
    ...: 

In [7]: list(descend_object(data)) 
Out[7]: 
['Y/o/tmpntzREn.tmp', 
'z/c/tmp6DmQhS.tmp', 
'5/X/tmp2oWhu5.tmp', 
'y/H/tmp6Po0_X.tmp'] 
+0

残念ながら、私はPython 2.7のために開発しています。これに相当するのは2.7ですか? –

+1

@IanFiddesはい、もちろんです。 –

+0

@IanFiddesが編集をチェックアウトすると、Python 2はちょっとした冗長性を必要とします... –

関連する問題