简体   繁体   English

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

[英]How to group and count objects by property in a list?

I have a list with objects like this: 我有一个包含这样的对象的列表:

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

I need group objects by two fields - diagnosis and doctor , and then counting their. 我需要按两个字段( diagnosisdoctor分组对象,然后对它们进行计数。

From this: 由此:

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),

I need get something like this: 我需要这样的东西:

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

In the future this may be more fields. 将来可能会有更多领域。 I have to count how many times a person has visited the same doctor with the same diagnosis. 我必须计算一个人去看同一诊断相同的医生的次数。 Thanks. 谢谢。

If I understand the question correctly, you are asking to count how many times a given doctor issued a specific diagnosis. 如果我对问题的理解正确,则您要计算给定医生发出特定诊断的次数。 In this case, Counter from collections can prove handy: 在这种情况下,来自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

You could use a dict as a class attribute to do the counting and then reverse the keys and value after: 您可以使用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()})

Output: 输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM