splitting a list into n groups
Eddie Corns
eddie at holyrood.ed.ac.uk
Thu Oct 9 07:17:12 EDT 2003
More information about the Python-list mailing list
Thu Oct 9 07:17:12 EDT 2003
- Previous message (by thread): splitting a list into n groups
- Next message (by thread): splitting a list into n groups
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Peter Otten <__peter__ at web.de> writes: >Eddie Corns wrote: >> Rajarshi Guha <rajarshi at presidency.com> writes: >> >>>Hi, >>> is there an efficient (pythonic) way in which I could split a list into >>>say 5 groups? By split I mean the the first x members would be one group, >>>the next x members another group and so on 5 times. (Obviously x = >>>lengthof list/5) >> >> How about: >> >> ------------------------------------------------------------ >> def span (x, n): >> return range(0, x, n) >> >> def group (l, num): >> n = (len(l)/num) + 1 >> return [l[s:s+n] for s in span (len(l), n)] >> >> # test cases >> l1 = range(100) >> print group (l1, 5) >> print group (l1, 6) >> print group (l1, 4) >> ------------------------------------------------------------ >More test cases :-) >for k in range(20): > l1 = range(k) > lol = group(l1, 5) > print len(lol), lol >0 [] >1 [[0]] >2 [[0], [1]] >3 [[0], [1], [2]] >4 [[0], [1], [2], [3]] >3 [[0, 1], [2, 3], [4]] >3 [[0, 1], [2, 3], [4, 5]] >4 [[0, 1], [2, 3], [4, 5], [6]] >4 [[0, 1], [2, 3], [4, 5], [6, 7]] >5 [[0, 1], [2, 3], [4, 5], [6, 7], [8]] >4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] >4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]] >4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]] >5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12]] >5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]] >4 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14]] >4 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]] >5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16]] >5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17]] >5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, >18]] Critiscism first thing in the morning!, luckily I got out of bed on the right side this morning. def span (x, n): return range(0, x, n) def group (l, num): n = ((len(l))/num) + 1 res = [l[s:s+n] for s in span (len(l), n)] return res + [None]*(num-len(res)) # test cases for k in range(1,20): l1 = range(k) lol = group(l1, 5) print len(lol), lol 5 [[0], None, None, None, None] 5 [[0], [1], None, None, None] 5 [[0], [1], [2], None, None] 5 [[0], [1], [2], [3], None] 5 [[0, 1], [2, 3], [4], None, None] 5 [[0, 1], [2, 3], [4, 5], None, None] 5 [[0, 1], [2, 3], [4, 5], [6], None] 5 [[0, 1], [2, 3], [4, 5], [6, 7], None] 5 [[0, 1], [2, 3], [4, 5], [6, 7], [8]] 5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9], None] 5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], None] 5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], None] 5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12]] 5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]] 5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14], None] 5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], None] 5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16]] 5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17]] 5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18]] With new improved boundary condition checking as well. The OP can put in checks for 0 if it makes any sense. Short lists will need more sophisticated handling to avoid results like: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14], None] We shouldn't expect too much from 3 lines of code, not even in Python. Eddie
- Previous message (by thread): splitting a list into n groups
- Next message (by thread): splitting a list into n groups
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list