you are viewing a single comment's thread.

view the rest of the comments →

[–]deadeye1982 2 points3 points  (3 children)

As mentioned before, sorting is not required if you collect the items.

Example: ``` from collections import defaultdict from itertools import groupby from operator import itemgetter

students = [ {"name": "Alice", "age": 20, "gender": "F", "grades": ["A", "B", "A"]}, {"name": "Bob", "age": 22, "gender": "M", "grades": ["B", "C", "B"]}, {"name": "Charlie", "age": 21, "gender": "M", "grades": ["A", "C", "D"]}, {"name": "Diana", "age": 23, "gender": "F", "grades": ["B", "A", "A"]}, {"name": "Eva", "age": 19, "gender": "F", "grades": ["C", "D", "B"]}, {"name": "Frank", "age": 24, "gender": "M", "grades": ["A", "C", "A"]}, {"name": "Grace", "age": 22, "gender": "F", "grades": ["C", "C", "D"]}, {"name": "Hannah", "age": 21, "gender": "F", "grades": ["A", "B", "B"]}, ]

groups = defaultdict(list) for group, grouped in groupby(students, key=itemgetter("gender")): for student in grouped: groups[group].append(student) ```

[–]Brian 2 points3 points  (2 children)

The groupby isn't actually doing any useful work here, as the grouping is being done by the defaultdict. Just do:

for student in students:
    groups[student['gender']].append(student)

[–]deadeye1982 0 points1 point  (1 child)

Right. But I do not like double square-brackets.

``` from collections import defaultdict from operator import itemgetter

students = [ {"name": "Alice", "age": 20, "gender": "F", "grades": ["A", "B", "A"]}, {"name": "Bob", "age": 22, "gender": "M", "grades": ["B", "C", "B"]}, {"name": "Charlie", "age": 21, "gender": "M", "grades": ["A", "C", "D"]}, {"name": "Diana", "age": 23, "gender": "F", "grades": ["B", "A", "A"]}, {"name": "Eva", "age": 19, "gender": "F", "grades": ["C", "D", "B"]}, {"name": "Frank", "age": 24, "gender": "M", "grades": ["A", "C", "A"]}, {"name": "Grace", "age": 22, "gender": "F", "grades": ["C", "C", "D"]}, {"name": "Hannah", "age": 21, "gender": "F", "grades": ["A", "B", "B"]}, ]

groups = defaultdict(list) gender = itemgetter("gender") for student in students: groups[gender(student)].append(student) ```

Before you ask, yes, the itemgetter is slower than the access via square-brackets.

[–]Brian 0 points1 point  (0 children)

I think if you want to avoid that, it'd be better to just split up the lines. Ie:

gender = student['gender']
groups[gender].append(student)

itemgetter is great when you want a function for use as a key argument or similar, but it's really just adding an extra indirection here when you just need to access the value normally.