如何使用列表项来寻址字典键并附加相应的值

时间:2012-08-22 13:59:21

标签: python dictionary python-2.7

我有一个包含客户信息的列表,客户列表中的每个项目本身就是一组相应的信息。所以:

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

每个客户信息集中的数字是我需要分配客户的类别。也就是说,我有一个带有n个键的字典,每个类别一个:

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

现在我需要将客户分配到各自的类别,以便客户1最终分为第一,第二和第三类 - 而客户2则分为两个和五个。当然,我可以运行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 个答案:

答案 0 :(得分: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']}