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

来自wikipedia 上的 autovivification 文章

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

你可以试试groupbyin itertools

于 2012-06-26T01:04:21.017 回答