oldspice
oldspice

Reputation: 3383

How to sort a list of lists by a specific index of the inner list?

I have a list of lists. For example,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

If I wanted to sort the outer list by the string field of the inner lists, how would you do that in python?

Upvotes: 318

Views: 415232

Answers (12)

Nishan B
Nishan B

Reputation: 845

Sorting a Multidimensional Array [execute here][1]

points=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]

def getKey(x):
   return [x[0],-x[1]]

points.sort(key=getKey)

print(points)

Upvotes: 1

Thomas Juul Dyhr
Thomas Juul Dyhr

Reputation: 101

Using a custom key function you can easily sort any list of lists as you want:

L = [[0,1,'f'], [4,2,'t'], [9,4,'afsd']]

def sorter(lst):
    return lst[2].casefold()

L.sort(key=sorter)

# result: [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

Upvotes: 1

NicoNu
NicoNu

Reputation: 1

Make sure that you do not have any null or NaN values in the list you want to sort. If there are NaN values, then your sort will be off, impacting the sorting of the non-null values.

Check out Python: sort function breaks in the presence of nan

Upvotes: 0

EgmontDeVos
EgmontDeVos

Reputation: 21

**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

correct me if i'm wrong but isnt the 'x[2]' calling the 3rd item in the list, not the 3rd item in the nested list? should it be x[2][2]?

Upvotes: 2

Aghiad Alzein
Aghiad Alzein

Reputation: 179

More easy to understand (What is Lambda actually doing):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

Upvotes: 2

Abhi
Abhi

Reputation: 1177

array.sort(key = lambda x:x[1])

You can easily sort using this snippet, where 1 is the index of the element.

Upvotes: 16

Tushar Niras
Tushar Niras

Reputation: 3863

I think lambda function can solve your problem.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

Upvotes: 8

Rahul Kumar
Rahul Kumar

Reputation: 371

multiple criteria can also be implemented through lambda function

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

Upvotes: 21

fider
fider

Reputation: 2036

Itemgetter lets you to sort by multiple criteria / columns:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

Upvotes: 100

John La Rooy
John La Rooy

Reputation: 304167

This is a job for itemgetter

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

It is also possible to use a lambda function here, however the lambda function is slower in this simple case

Upvotes: 403

mouad
mouad

Reputation: 70031

in place

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

not in place using sorted:

>>> sorted(l, key=lambda x: x[2])

Upvotes: 263

Jim Brissom
Jim Brissom

Reputation: 32919

Like this:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))

Upvotes: 8

Related Questions