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にありますか? たとえば、「タイプ」、「アプリケーション」、「名前」の順に指定すると、「野菜」、「果物」、「乳製品」の 3 つのキーのみを持つ辞書が作成されます...

野菜には「StoreA」と「StoreB」のみが含まれ、果物には「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'}]

それができたら、探しているネストされた辞書を作成するための 1 つのオプションを次に示します。

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もちろん、ループの内容を 1 行に入れることもできます。

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