Reputation: 3383
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
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
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
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
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
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
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
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
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
Reputation: 2036
Itemgetter lets you to sort by multiple criteria / columns:
sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
Upvotes: 100
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
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
Reputation: 32919
Like this:
import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))
Upvotes: 8