-1

I have a nested list

list_a = 
[['1 order', 15, 3 ],
['1 order', 29, 2],
['1 order', 5, 1],
['2 order', 2, 3],
['2 order', 1, 2],
['2 order', 17, 1],
['3 order', 2, 3],
['3 order', 10, 2],
['3 order', 1, 1]]

After applying sorting on second element

sort_by_second_attribute = sorted(list_a, key = lambda k : k[1])

output is

[['2 order', 1, 2],
['3 order', 1, 1],
['2 order', 2, 3],
['3 order', 2, 3],
['1 order', 5, 1],
['3 order', 10, 2],
['1 order', 15, 3],
['2 order', 17, 1],
['1 order', 29, 2]] 

But, I want to maintain the sorted order of first attribute and then sort on second attribute. The output I want is

[['1 order', 5, 3],
['1 order', 15, 2],
['1 order', 29, 1],
['2 order', 1, 3],
['2 order', 2, 2],
['2 order', 17, 1],
['3 order', 1, 3],
['3 order', 2, 2],
['3 order', 10, 1]] 
john
  • 11
  • 8

3 Answers3

1

Do

sort_by_second_attribute = sorted(list_a, key = lambda k : (k[0], k[1]))

But ideally don't store your data in lists, but create appropriate objects for it. Because it's totally unclear from your code what index=1 or index=2 mean, what data is stored under those indexes.

Yurii
  • 827
  • 2
  • 13
  • 23
0

You can use a secondary sorting condition by making a tuple

list_b = sorted(list_a, key=lambda k: (k[0], k[1]))
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 helping.py 
[['1 order', 5, 1], ['1 order', 15, 3], ['1 order', 29, 2], ['2 
order', 1, 2], ['2 order', 2, 3], ['2 order', 17, 1], ['3 order', 1,
1], ['3 order', 2, 3], ['3 order', 10, 2]]
vash_the_stampede
  • 4,590
  • 1
  • 8
  • 20
0

You can return a tuple from your key, egkey = lambda k : (k[1], k[2]), and the attributes are sorted in that order.

blue_note
  • 27,712
  • 9
  • 72
  • 90