2012-10-30 70 views
0

假設我有以下CSV:「坍塌」如何將CSV轉換爲Python中更結構化的字典?

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」 水果將有「商店B」和「C店」(沒有重複的B店,即使梅花是在商店B)

和鑽探的最深層次字典將是果實。什麼是完成這個最好的方法?語法是讚賞。

+2

你有沒有想過使用數據庫,如[SQLite](http://docs.python.org/2/library/sqlite3.html)? –

+0

使用defaultdicts創建一個遞歸結構,我認爲有幾行會做到這一點 –

回答

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']) 
相關問題