On Mar 13, 6:34 pm, Noah <[EMAIL PROTECTED]> wrote: > What is the fastest way to select N items at a time from a dictionary? > I'm iterating over a dictionary of many thousands of items. > I want to operate on only 100 items at a time. > I want to avoid copying items using any sort of slicing. > Does itertools copy items? > > This works, but is ugly: > > >>> from itertools import * > >>> D = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8, 'i':9, > >>> 'j':10} > >>> N = 3 > >>> for G in izip(*[chain(D.items(), repeat(None, N-1))]*N): > > ... print G > ... > (('a', 1), ('c', 3), ('b', 2)) > (('e', 5), ('d', 4), ('g', 7)) > (('f', 6), ('i', 9), ('h', 8)) > (('j', 10), None, None) > > I'd prefer the last sequence not return None > elements and instead just return (('j',10)), but this isn't a huge > deal. > > This works and is clear, but it makes copies of items: > > >>> ii = D.items() > >>> for i in range (0, len(ii), N): > > ... print ii[i:i+N] > ... > [('a', 1), ('c', 3), ('b', 2)] > [('e', 5), ('d', 4), ('g', 7)] > [('f', 6), ('i', 9), ('h', 8)] > [('j', 10)] >
groupby? import itertools D = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8, 'i':9, 'j':10} N = 3 it = itertools.groupby(enumerate(D.items()), lambda t: int(t[0]/N)) for each in it: print tuple(t[1] for t in each[1]) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list