[BangPypers] partial flattening of list

Anand Balachandran Pillai abpillai at gmail.com
Tue Jul 27 11:53:13 CEST 2010


On Tue, Jul 27, 2010 at 3:16 PM, Anand Balachandran Pillai <
abpillai at gmail.com> wrote:

>
>
> On Tue, Jul 27, 2010 at 2:29 PM, Shekhar Tiwatne <pythonic at gmail.com>wrote:
>
>> On Tuesday 27 July 2010 12:18 PM, Vikram wrote:
>>
>>> have the following:
>>>
>>>
>>>
>>>>  x
>>>>>>
>>>>>>
>>>>> [['NM100', 1, 2], ['NM100', 3, 4], ['NM200', 5, 6]]
>>>
>>>
>>>>  for i in x:
>>>>>>
>>>>>>
>>>>> ...   print i
>>> ...
>>> ['NM100', 1, 2]
>>> ['NM100', 3, 4]
>>> ['NM200', 5, 6]
>>>
>>> ------
>>> how does one obtain list z such that
>>>
>>> z = [['NM100',1,2,3,4],['NM200',5,6]]
>>>
>>
> This problem begs for the use of collections.defaultdict class.
>
> All the other solutions are ok, but defaultdict is meant to solve
> problems like this.
>
> Here is the solution.
>
> >>> import collections
> >>> l=[['NM100', 1, 2], ['NM100', 3, 4], ['NM200', 5, 6]]
> >>> l2=[[x[0], x[1:]] for x in l]
> >>> d = collections.defaultdict(list)
> >>> for k, v in l2: d[k].extend(v)
> >>> [[k, v] for k,v in d.iteritems()]
> [['NM100', [1, 2, 3, 4]], ['NM200', [5, 6]]]
>
> What you want are the elements of the final list.
>

I didn't notice you want

z = [['NM100',1,2,3,4],['NM200',5,6]]

rather than,

z=  [['NM100', [1, 2, 3, 4]], ['NM200', [5, 6]]]

So replace last line with,

>>> [[k] +  v for k,v in d.iteritems()]
[['NM100', 1, 2, 3, 4], ['NM200', 5, 6]]



> --Anand
>
>
>
>



-- 
--Anand


More information about the BangPypers mailing list