如何按列表中的属性对对象进行分组和计数?

时间:2015-10-02 18:45:07

标签: python python-3.x

我有一个包含这样的对象的列表:

class Visit:
    def __init__(self):
        self.date = ''
        self.diagnosis=''
        self.doctor=''
        self.price=0

我需要两个字段的组对象 - diagnosisdoctor,然后计算它们。

由此:

list = [Visit(date = '2014-05-24',diagnosis='Z00', doctor='Smith', price=0),
        Visit(date = '2014-05-25',diagnosis='Z00', doctor='Smith', price=0),
        Visit(date = '2014-05-15',diagnosis='Z00', doctor='Smith', price=0),
        Visit(date = '2014-05-24',diagnosis='K40', doctor='Smith', price=0),
        Visit(date = '2014-05-20',diagnosis='K40', doctor='Smith', price=0),
        Visit(date = '2014-05-27',diagnosis='K40', doctor='Jakobs', price=0),
        Visit(date = '2014-05-21',diagnosis='J00', doctor='Abrams', price=0),
        Visit(date = '2014-05-22',diagnosis='J00', doctor='Abrams', price=0),

我需要得到这样的东西:

{ 3 : {'doctor':'Smith','diagnosis':'Z00'},     
  2 : {'doctor':'Smith','diagnosis':'K40'}, 
  1 : {'doctor':'Jakobs','diagnosis':'K40'},
  2 : {'doctor':'Abrams','diagnosis':'J00'}}

将来可能会有更多领域。我必须计算一个人在同一诊断中去过同一位医生的次数。感谢。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,那么您需要计算某位医生发出特定诊断的次数。在这种情况下,来自Counter的{​​{1}}可以证明是方便的:

collections

答案 1 :(得分:1)

您可以使用dict作为类属性来进行计数,然后在以下情况后反转键和值:

from collections import defaultdict

class Visit:
    data = defaultdict(int)
    def __init__(self, date, diagnosis, doctor, price):
        self.date = date
        self.diagnosis = diagnosis
        self.doctor = doctor
        self.price = price
        Visit.data[(("doctor", doctor), ("diagnosis", diagnosis))] += 1


lst = [Visit(date='2014-05-24', diagnosis='Z00', doctor='Smith', price=0),
       Visit(date='2014-05-25', diagnosis='Z00', doctor='Smith', price=0),
       Visit(date='2014-05-15', diagnosis='Z00', doctor='Smith', price=0),
       Visit(date='2014-05-24', diagnosis='K40', doctor='Smith', price=0),
       Visit(date='2014-05-20', diagnosis='K40', doctor='Smith', price=0),
       Visit(date='2014-05-27', diagnosis='K40', doctor='Jakobs', price=0),
       Visit(date='2014-05-21', diagnosis='J00', doctor='Abrams', price=0),
       Visit(date='2014-05-22', diagnosis='J00', doctor='Abrams', price=0)]

print({v:dict(k) for k,v in Visit.data.items()})

输出:

{1: {'diagnosis': 'K40', 'doctor': 'Jakobs'}, 
2: {'diagnosis': 'K40', 'doctor': 'Smith'}, 
3: {'diagnosis': 'Z00', 'doctor': 'Smith'}}