littletable делает этот вид простой нарезки и нарезки кубиками простым, делая список объектов доступным / запрашиваемым / поворачиваемым по атрибуту, например, базу данных мини-в памяти, но с еще меньшими издержками, чем SQLite.
from collections import namedtuple
from littletable import Table
data = """\
1 john1 23 54 54
2 john2 34 45 66
3 john3 35 43 54
4 john2 34 54 78
5 john1 12 34 65
6 john3 34 55 66"""
Record = namedtuple("Record", "id name length width height")
def makeRecord(s):
s = s.strip().split()
# convert all but name to ints, and build a Record instance
return Record(*(ss if i == 1 else int(ss) for i,ss in enumerate(s)))
# create a table and load it up
# (if this were CSV data, would be even simpler)
t = Table("data")
t.create_index("id", unique=True)
t.create_index("name")
t.insert_many(map(makeRecord, data.splitlines()))
# get a record by unique key
# (unique indexes return just the single record)
print t.id[4]
print
# get all records matching an indexed value
# (non-unique index retrievals return a new Table)
for d in t.name['john1']:
print d
print
# dump summary pivot tables
t.pivot('name').dump_counts()
print
t.create_index('length')
t.pivot('name length').dump_counts()
Печать:
Record(id=4, name='john2', length=34, width=54, height=78)
Record(id=1, name='john1', length=23, width=54, height=54)
Record(id=5, name='john1', length=12, width=34, height=65)
Pivot: name
john1 2
john2 2
john3 2
Pivot: name,length
12 23 34 35 Total
john1 1 1 0 0 2
john2 0 0 2 0 2
john3 0 0 1 1 2
Total 1 1 3 1 6