7

for loops以下のこのデータを使用して現在行っているように、ネストされた 3 つを使用せずに辞書データを反復処理するより良い方法はありますか? ところで、私はpython 2.6を使用しています。

data = {'08132012': 
           {
            'id01': [{'code': '02343','status': 'P'},{'code': '03343','status': 'F'}],
            'id02': [{'code': '18141','status': 'F'},{'code': '07777','status': 'F'}]
           }
        }   

3forループの現在のコードは次のとおりです。

  for date in data:
      for id in data[date]:
          for trans in data[date][id]:
              print "Date: %s" % date
              print "Processing id: %s" % id
              print trans['code']
              print trans['status']

              //query to database

EDITED : 有効なデータ値

4

3 に答える 3

8

データのネストされた性質を考えると、どこかでネストされたループを回避する方法はないと思います。

ただし、次のように、データのフラット化ジェネレーターを作成することで、プログラム ロジックのほとんどをネストする必要がなくなります。

def flatten(data):
    for date in data:
        for id in data[date]:
            for trans in data[date][id]:
                yield (date, id, trans)

def process(data):
    for date, id, trans in flatten(data):
        # do stuff with date, id, trans
于 2012-08-25T06:03:36.417 に答える
4

ジェネレーターはかなり単純です。

>>> flat = ((d, id, t) for d in data for id in data[d] for t in data[d][id])
>>> for date, id, trans in flat:
...     print date, id, trans
...
08132012 id02 {'status': 'F', 'code': '18141'}
08132012 id02 {'status': 'F', 'code': '07777'}
08132012 id01 {'status': 'P', 'code': '02343'}
08132012 id01 {'status': 'F', 'code': '03343'}
>>>
于 2012-08-25T09:20:46.300 に答える
4

データの出所の詳細を知らなくても、保存namedtuple方法の構造を変更できる場合は、使用を検討することをお勧めしdataます。これにより、物事が少しきれいになり、読みやすくなります。

次に例を示します。

>>> from collections import namedtuple
>>> Record = namedtuple('Record', ['date', 'id', 'code', 'status'])
>>> records = []
>>> records.append(Record('08132012', 'id01', '02343','P'))
>>> records.append(Record('08132012', 'id01', '03343','F'))
>>> records.append(Record('08132012', 'id02', '18131','F'))
>>> records.append(Record('08132012', 'id02', '07777','F'))
>>> for record in records:
...     print "Date: %s" %record.date
...     print "Processing id: %s" %record.id
...     print record.code
...     print record.status
... 
Date: 08132012
Processing id: id01
02343
P
Date: 08132012
Processing id: id01
03343
F
Date: 08132012
Processing id: id02
18131
F
Date: 08132012
Processing id: id02
07777
F

もっと楽しく:

status'F'であるレコードのリストを取得します。

>>> Fs = [record for record in records if record.status == 'F']
>>> Fs
[Record(date='08132012', id='id01', code='03343', status='F'),
Record(date='08132012', id='id02', code='18131', status='F'),
Record(date='08132012', id='id02', code='07777', status='F')]

並べ替えcode:

>>> records.append(Record('08122012', 'id03', '00001', 'P'))
>>> records.sort(key=lambda x:x.code)
>>> records
[Record(date='08122012', id='id03', code='00001', status='P'),
 Record(date='08132012', id='id01', code='02343', status='P'),
 Record(date='08132012', id='id01', code='03343', status='F'),
 Record(date='08132012', id='id02', code='07777', status='F'),
 Record(date='08132012', id='id02', code='18131', status='F')]
于 2012-08-25T06:28:13.440 に答える