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

2024-09-27 09:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,上面有这样的对象:

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

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

从这里:

^{pr2}$

我需要这样的东西:

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

将来这可能会是更多的领域。我得数一数一个人用同样的诊断去看同一个医生多少次。谢谢。在


Tags: 对象self列表dateinitdefvisitprice
2条回答

您可以使用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()})

输出:

^{pr2}$

如果我正确地理解了这个问题,你是在问一个医生有多少次做了特定的诊断。在这种情况下,collections中的Counter很方便:

from collections import Counter

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

visits = [Visit() for _ in xrange(10)]

# tuples = [(visit.doctor, visit.diagnosis) for visit in visits]
# counted_visits = Counter(tuples)
counted_visits = Counter((visit.doctor, visit.diagnosis) for visit in visits)
output = [({'Doctor' : doctor, 'Diagnosis' : diagnosis}, k) \
    for (doctor, diagnosis), k in counted_visits.items()]

print output

相关问题 更多 >

    热门问题