7

Here is my question i have tuple1=[(1, 3), (3, 2), (2, 1)] i want to sort tuple based on last digit of each tuple so the resultant will look like this output=[(2, 1), (3, 2), (1, 3)] below is my code

    i=0
for x in tuples:
    c.append(x[len(x)-1])
    last=sorted(c)
    for y in last.iteritems():
        if(y in x[len(x)-1]):
            print x             
            #b.insert(i,x)
i=i+1

after running iam getting an error message

    Traceback (most recent call last):
    File "x.py", line 47, in <module>
   sort_last([(1, 3), (3, 2), (2, 1)])
  File "x.py", line 35, in sort_last
 if(y in x[len(x)-1]):
  TypeError: argument of type 'int' is not iterable
Friend
  • 1,326
  • 11
  • 38
  • 62
  • My bad, that question is not about sorting, but the solution is identical: specify the `key` function to `sort` or `sorted`. – Lev Levitsky Feb 12 '13 at 09:32

1 Answers1

26

Specify the key argument in the sorted function.

>>> tuple1=[(1, 3), (3, 2), (2, 1)]
>>> output = sorted(tuple1, key=lambda x: x[-1])
>>> print output
[(2, 1), (3, 2), (1, 3)]

The sorted function (as well as the list.sort method) has an optional key argument which specifies what to sort the list on.

Volatility
  • 31,232
  • 10
  • 80
  • 89
  • +1 for this elegant solution. – ConfusedProgrammer Feb 12 '13 at 09:34
  • yup it works.. but is there any other method without using 'lambda' i mean using for loop itself.... – Friend Feb 12 '13 at 09:48
  • 2
    If you need it in reverse order you can also add the `reverse` keyword: `output = sorted(tuple1, key=lambda x: x[-1], reverse=True)` – drekyn Feb 12 '13 at 09:49
  • 2
    @Friend this is the most pythonic way to do that, otherwise you should rely on any sorting algorithm and implement it yourself, dealing with bugs, efficiency, etc... are you sure you want to do that? (Rule of thumb: do not reinvent the wheel) – drekyn Feb 12 '13 at 09:51