1

次の形式のデータが与えられた場合:

data = [
    ['Airbus', 'R&D', '01', 5],
    ['Airbus', 'R&D', '02', 8],
    ['Airbus', 'Marketing', '01', 9],
    ['Airbus', 'Marketing', '02', 54],
    ['Netgear', 'R&D', '01', 12],
    ['Netgear', 'R&D', '02', 5],
    ['Netgear', 'Marketing', '01', 6],
    ['Netgear', 'Marketing', '02', 11],
    ['Toyota', 'R&D', '01', 9],
    ['Toyota', 'R&D', '02', 52],
    ['Toyota', 'Marketing', '01', 43],
    ['Toyota', 'Marketing', '02', 34],
]

Python を使用して、より階層的な構造を取得するにはどうすればよいですか。

data = {

'Airbus': {
    'R&D': {
        '01': 5, '02': 8
    },
    'Marketing': {
        '01': 9,'02': 54
    }
},
'Netgear'
    etc...
}

?

4

4 に答える 4

6

ネストされた非常に単純なdefaultdict(またはおそらくdict.setdefault->読みにくい):

d = collections.defaultdict(lambda:collections.defaultdict(dict))
for x,y,k,v in data:
    d[x][y][k]=v

そしてきれいに印刷します:

>>> pprint.pprint(d)
{'Airbus': {'Marketing': {'01': 9, '02': 54},
            'R&D': {'01': 5, '02': 8}},
 'Netgear': {'Marketing': {'01': 6, '02': 11},
             'R&D': {'01': 12, '02': 5}},
 'Toyota': {'Marketing': {'01': 43, '02': 34},
            'R&D': {'01': 9, '02': 52}}}
于 2012-06-26T01:05:16.317 に答える
1

以下のコードは、長さに関してもう少し柔軟ですが、最小長のレコード (最小は 2 つの要素 (キー、値)) のチェックはありません。

def nest(data):
    result = {}
    for record in data:
        assert len(record) > 2
        d = result
        for key in record[:-2]:
            d = d.setdefault(key, {})

        key,value = record[-2:]
        d[key] = value
    return result
于 2012-06-26T01:13:37.047 に答える
1

ウィキペディアの自動活性化の記事から

from collections import defaultdict
def tree():
    return defaultdict(tree)

d = tree()
for x,y,k,v in data:
    d[x][y][k] = v
于 2012-06-26T01:45:51.830 に答える
0

groupbyでお試しいただけますitertools

于 2012-06-26T01:04:21.017 に答える