Converting a flat list to a list of tuples

Bengt Richter bokr at oz.net
Tue Nov 22 21:58:36 EST 2005


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 :-)

Regards,
Bengt Richter



More information about the Python-list mailing list