[Tutor] Grouping based on attributes of elements in a List

Sander Sweers sander.sweers at gmail.com
Tue Mar 29 23:52:03 CEST 2011


On 29 March 2011 22:03, ranjan das <ranjand2005 at gmail.com> wrote:
> List=[( 'G1', 'CFS', 'FCL', 'R1' ),('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9'),
> ('G4', 'CFS', 'FCL', 'R10' ), ('G2',  'LOOSEFREIGHT', 'LCL', 'R4' ), ('G1',
> 'CFS', 'FCL', 'R2' ), ('G2', 'LOOSEFREIGHT', 'LCL', 'R5')  ]
>
>
> now I want to group this elements of List  first by index [1] that is (CFS
> and LOOSEFREIGHT ) together and for those elements which are grouped
> together for LOOSEFREIGHT, i want to further divide them into different
> groups based on index[2] that is (LCL or MIXEDLCL)
>
>
> So essentially i want them grouped into different lists and my solution
> should be  of the form
>
> New_List=[ [ ( 'G1', 'CFS', 'FCL', 'R1' ), ('G1', 'CFS', 'FCL', 'R2' ),
> ('G4', 'CFS', 'FCL', 'R10' ) ], [ ('G2',  'LOOSEFREIGHT', 'LCL', 'R4' ),
> ('G2', 'LOOSEFREIGHT', 'LCL', 'R5' )], [ ('G3', 'LOOSEFREIGHT', 'MIXEDLCL',
> 'R9')] ]
>
> How do I do it?

You can use itemgetter from the operator module. The below should do
what you want. I am using sorted to return a new list but you can also
sort the list in place with list.sort().

>>> import operator
>>> l =[( 'G1', 'CFS', 'FCL', 'R1' ),('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9'), ('G4', 'CFS', 'FCL', 'R10' ), ('G2',  'LOOSEFREIGHT', 'LCL', 'R4' ), ('G1', 'CFS', 'FCL', 'R2' ), ('G2', 'LOOSEFREIGHT', 'LCL', 'R5') ]
>>> sorted(l, key=operator.itemgetter(1,2))
[('G1', 'CFS', 'FCL', 'R1'), ('G4', 'CFS', 'FCL', 'R10'), ('G1',
'CFS', 'FCL', 'R2'), ('G2', 'LOOSEFREIGHT', 'LCL', 'R4'), ('G2',
'LOOSEFREIGHT', 'LCL', 'R5'), ('G3', 'LOOSEFREIGHT', 'MIXEDLCL',
'R9')]

Greets
Sander


More information about the Tutor mailing list