Reputation: 2415
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.
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.
Upvotes: 3
Views: 1550
Reputation: 11602
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:
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
Upvotes: 4
Reputation: 180540
You could use a dict as a class attribute to do the counting and then reverse the keys and value after:
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'}}
Upvotes: 1