0

假设我有以下 CSV:

Type   Name        Application  

Vegetable   Lettuce    StoreA
Fruit       Apple      StoreB
Vegetable   Orange     StoreB
Fruit       Pear       StoreC
Dairy       Milk       StoreA
Fruit       Plum       StoreB
Fruit       Plum       StoreA

python中是否有一些简单的方法可以让我根据我希望“折叠”的某些字段生成结构化的字典?例如,通过依次指定“类型”、“应用程序”、“名称”……它会创建一个只有三个键“蔬菜”、“水果”、“乳制品”的字典……

蔬菜只会有“StoreA”和“StoreB” Fruit 会有“Store B”和“Store C”(即使 Plum 在 Store B 中也没有重复的 Store B)

并且钻到字典的最深层次将是结果。实现这一目标的最佳方法是什么?语法受到赞赏。

4

1 回答 1

0

由于这似乎不是解析 CSV 的问题,我假设您可以使用csv.DictReader或其他方法将数据转换为以下格式:

rows = [{'Type': 'Vegetable', 'Name': 'Lettuce', 'Application': 'StoreA'},
        {'Type': 'Fruit', 'Name': 'Apple', 'Application': 'StoreB'},
        {'Type': 'Vegetable', 'Name': 'Orange', 'Application': 'StoreB'},
        {'Type': 'Fruit', 'Name': 'Pear', 'Application': 'StoreC'},
        {'Type': 'Dairy', 'Name': 'Milk', 'Application': 'StoreA'},
        {'Type': 'Fruit', 'Name': 'Plum', 'Application': 'StoreB'},
        {'Type': 'Fruit', 'Name': 'Plum', 'Application': 'StoreA'}]

一旦你有了它,这里是创建你正在寻找的嵌套字典的一个选项:

result = {}
for row in rows:
    stores = result.setdefault(row['Type'], {})
    names = stores.setdefault(row['Application'], [])
    names.append(row['Name'])

>>> pprint.pprint(result)
{'Dairy': {'StoreA': ['Milk']},
 'Fruit': {'StoreA': ['Plum'],
           'StoreB': ['Apple', 'Plum'],
           'StoreC': ['Pear']},
 'Vegetable': {'StoreA': ['Lettuce'],
               'StoreB': ['Orange']}}

您当然可以将for循环的内容放在一行中:

for row in rows:
    result.setdefault(row['Type'], {}).setdefault(row['Application'], []).append(row['Name'])
于 2012-10-30T22:27:10.900 回答