2012-08-22 11 views
1

我已經獲得了一個列表,其中包含客戶信息,客戶列表中的每個項目本身都是一組相應信息的列表。因此:如何使用列表項來查找字典密鑰並附加相應的值

customers = [ 
    [customerID1, NameOfCustomer1, etc., 01 02 03] 
    [customerID2, NameOfCustomer2, etc., 02 05] 
    . 
    . 
    . 
    ] 

每個客戶信息集中的數字都是我需要分配給客戶的類別。也就是說,我有一本字典有N個按鍵,一個爲每個類別:

dict = { 
    01: [], 
    02: [], 
    03: [], 
    04: [], 
    05: [] 
    } 

現在我需要的客戶,使客戶的1類一,二,三端最多可以分配到各自的類別 - 而客戶二進入二和五。當然,我可以運行n個if語句,每個類別都有一個,但隨着越來越多類別的發現,我感到頗爲不安。因此,什麼我想做的事:得到一個來自每個客戶的類別列表:

for customer in customers: 
    categories = re.findall(r'[0-9]{2}', customer[3]) 

這麼多容易的部分。現在我通過這個「categories'列表尋找一種方式,基本循環:

for category in categories: 
    dict[category].append(customer) 

但是,巨蟒似乎並沒有使用一個變量來選擇一個鍵喜歡我。這可能是一個愚蠢簡單的解決方案 - 我只是沒有意識到這一點。

非常感謝大家!

回答

1

步驟#1是將這些扁平列表變成一個字典,這對訪問屬性更有用。我就想象你的數據實際上的樣子,但你應該得到的想法:

>>> customers = [ 
...  ['customerID1', 'NameOfCustomer1', 'e','t','c', '01 02 03'], 
...  ['customerID2', 'NameOfCustomer2', 'e','t','c', '02 05'] 
...  ] 
>>> 
>>> cust_keys = ('id', 'name', 'q1','q2','q3','categories') 
>>> cdicts = [dict(zip(cust_keys, cust_vals)) for cust_vals in customers] 
>>> cdicts 
[{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer1', 'id': 'customerID1', 'categories': '01 02 03'}, {'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer2', 'id': 'customerID2', 'categories': '02 05'}] 

更好的辦法是有類別爲代碼的列表,我們不需要正則表達式爲:

現在
>>> for cdict in cdicts: 
...  cdict['categories'] = cdict['categories'].split() 
... 
>>> cdicts 
[{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer1', 'id': 'customerID1', 'categories': ['01', '02', '03']}, {'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer2', 'id': 'customerID2', 'categories': ['02', '05']}] 

,以追加到一堆類別列表中,我們可以檢查按鍵是否存在每次看和做一個空列表,如果沒有,或者我們可以使用一個defaultdict它處理爲我們:

>>> from collections import defaultdict 
>>> by_categories = defaultdict(list) 
>>> for customer in cdicts: 
...  for category in customer['categories']: 
...   by_categories[category].append(customer) 
... 

其中產生

>>> for k in sorted(by_categories): 
...  print 'category', k, 'contains:' 
...  for v in by_categories[k]: 
...   print v 
... 
category 01 contains: 
{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer1', 'id': 'customerID1', 'categories': ['01', '02', '03']} 
category 02 contains: 
{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer1', 'id': 'customerID1', 'categories': ['01', '02', '03']} 
{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer2', 'id': 'customerID2', 'categories': ['02', '05']} 
category 03 contains: 
{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer1', 'id': 'customerID1', 'categories': ['01', '02', '03']} 
category 05 contains: 
{'q1': 'e', 'q3': 'c', 'q2': 't', 'name': 'NameOfCustomer2', 'id': 'customerID2', 'categories': ['02', '05']} 
+0

謝謝噸帝斯曼! 工作,我甚至學到了一些東西! 乾杯! – JoW

+0

謝謝你讓我知道...做到了。 – JoW

相關問題