Converting a flat list to a list of tuples
bonono at gmail.com
bonono at gmail.com
Tue Nov 22 22:05:23 EST 2005
Bengt Richter wrote:
> On 22 Nov 2005 16:32:25 -0800, "bonono at gmail.com" <bonono at gmail.com> wrote:
>
> >
> >Bengt Richter wrote:
> >> On 22 Nov 2005 07:42:31 -0800, "George Sakkis" <gsakkis at rutgers.edu> wrote:
> >>
> >> >"Laurent Rahuel" wrote:
> >> >
> >> >> Hi,
> >> >>
> >> >> newList = zip(aList[::2], aList[1::2])
> >> >> newList
> >> >> [('a', 1), ('b', 2), ('c', 3)]
> >> >>
> >> >> Regards,
> >> >>
> >> >> Laurent
> >> >
> >> >Or if aList can get very large and/or the conversion has to be
> >> >performed many times:
> >> >
> >> >from itertools import islice
> >> >newList = zip(islice(aList,0,None,2), islice(aList,1,None,2))
> >> >
> >> Or, if you want to include fractional groups at the end
> >>
> >> >>> aList = ['a', 1, 'b', 2, 'c', 3]
> >> >>> from itertools import groupby
> >> >>> def grouper(n):
> >> ... def git():
> >> ... while True:
> >> ... for _ in xrange(n): yield 0
> >> ... for _ in xrange(n): yield 1
> >> ... git = git()
> >> ... def grouper(_): return git.next()
> >> ... return grouper
> >> ...
> >> >>> [tuple(g) for _, g in groupby(aList, grouper(2))]
> >> [('a', 1), ('b', 2), ('c', 3)]
> >> >>> [tuple(g) for _, g in groupby(aList, grouper(3))]
> >> [('a', 1, 'b'), (2, 'c', 3)]
> >> >>> [tuple(g) for _, g in groupby(aList, grouper(4))]
> >> [('a', 1, 'b', 2), ('c', 3)]
> >>
> >Personally, I would like to see it as [('a',1,'b',2), ('c',3,
> >None,None)], as a list of tuple of equal length is easier to be dealt
> >with.
> >
> >i = iter(aList)
> >zip(i,chain(i,repeat(None)),
> >chain(i,repeat(None)),chain(i,repeat(None)))
> >
> Yes, but OTOH you might like to loop and catch ValueError when/if the last tuple
> doesn't unpack properly. Then you don't have to worry about None vs a sentinel :-)
>
That to me is a matter of style. I in general prefer the no
catch/except way of coding, the filter/map way(or the unix pipe way).
Not that one is better than another.
But I think your solution for this case is a bit hard to swallow. I
would rather do it the more imperative way of :
def split(s,n):
a=[]
c=0
for x in s:
a.append(x)
c+=1
if c%n == 0:
yield a
a=[]
if a !=[]: yield a
list(split(aList,4))
More information about the Python-list
mailing list