Skip to content

Instantly share code, notes, and snippets.

@tetsuo
Created September 28, 2013 14:53
Show Gist options
  • Save tetsuo/6742855 to your computer and use it in GitHub Desktop.
Save tetsuo/6742855 to your computer and use it in GitHub Desktop.
grouping objects by attribute in python
import itertools
class A:
def __init__(self, uniq, key):
self.uniq = uniq
self.key = key
def __repr__(self):
return "%s(%s, %s)" % (self.__class__, self.uniq, self.key)
s = [A(9, 'ankara'), A(87, 'istanbul'), A(25, 'ankara'), A(43, 'antalya'),
A(3, 'istanbul'), A(99, 'izmir'), A(45, 'bursa'), A(32, 'antalya'),
A(67, 'izmir')]
print 'default:\n', s, '\n'
grouped_s = [tuple(g) for p, g in \
itertools.groupby(sorted(s, key=lambda k: k.key),
key=lambda k: k.key)]
print 'grouped:\n'
for p in grouped_s:
print p
"""
default:
[__main__.A(9, ankara), __main__.A(87, istanbul), __main__.A(25, ankara), __main__.A(43, antalya), __main__.A(3, istanbul), __main__.A(99, izmir), __main__.A(45, bursa), __main__.A(32, antalya), __main__.A(67, izmir)]
grouped:
(__main__.A(9, ankara), __main__.A(25, ankara))
(__main__.A(43, antalya), __main__.A(32, antalya))
(__main__.A(45, bursa),)
(__main__.A(87, istanbul), __main__.A(3, istanbul))
(__main__.A(99, izmir), __main__.A(67, izmir))
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment