簡體   English   中英

如何使用列表項尋址字典鍵並附加相應的值

[英]How to use a list item to address a dictionary key and append the respective value

我有一個保存客戶信息的列表,客戶列表的每個項目本身就是一組相應信息的列表。 所以:

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

每個客戶的信息集中的數字是我需要將客戶分配給的類別。 也就是說,我有一本包含n個鍵的字典,每個類別對應一個:

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

現在,我需要將客戶分配到各自的類別,以便客戶1最終分為類別1、2和3-而客戶2進入類別2和5。 當然,我可以運行n個if語句,每個現有類別一個,但是隨着類別數量的增加,我發現這相當令人不安。 因此,我想做的是:獲取每個客戶的類別列表:

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

簡單的部分就這么多。 現在,我正在尋找一種基本遍歷此“類別”列表的方法:

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

但是,python似乎不喜歡我使用變量來選擇鍵。 對於這個可能有一個非常簡單的解決方案-我只是不知道。

非常感謝大家!

步驟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']}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM