import csv,operator
from datetime import datetime
li = [['name','01/03/2012','job'],
      ['name','02/05/2013','job'],
      ['name','03/08/2014','job']]
sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)
Output:
No error, but simply not ordered
for x in range(1,len(li)):
    li[x][6]=datetime.strptime(li[x][6],'%d/%m/%Y')
li.sort(key=operator.itemgetter(6))
Output:
Traceback (most recent call last):
  File "U:/rmarshall/Work For Staff/ROB/_Python/__Python Projects Code/April Signed Terms.py", line 35, in <module>
    li.sort(key=operator.itemgetter(6))
TypeError: unorderable types: datetime.datetime() < str()
Could someone supply an example of ordering a the list li by date. For educational purposes I would appreciate examples of both the sorted method and itemgetter method with a comparison of efficiency.
Also, by the error on the itemgetter approach, is itemgetter simply not able to handle datetime objects.
Note:  I presume the ascending or descending order doesn't matter too much in this example as it can be simply flipped with reverse=True.
This should work.
print(sorted(li, key=lambda x: datetime.strptime(x[1], '%d/%m/%Y'), reverse=True))
You used row in the lamba which might have been defined before, but will never change.
I don't see a way to use itemgetter here. To be honest, there is a way, but it doesn't look good.
key_function = lambda x: datetime.strptime(itemgetter(1)(x), '%d/%m/%Y') 
print(sorted(li, key=key_function, reverse=True))
                        The following works:
>>> sorted(li, key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"), reverse=True)
[['name', '03/08/2014', 'job'], ['name', '02/05/2013', 'job'], ['name', '01/03/2
012', 'job']]
The problem with your use of the sorted() is that you're trying to create a datetime from row[1] which doesn't work. Change it to the lambda you created, as I've shown above.
You most likely have a row variable defined somewhere earlier, which is why it will not raise an error. However if I run the following:
>>> sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 1, in <lambda>
NameError: global name 'row' is not defined
Here's an example with itemgetter:
>>> sorted(l, key=itemgetter(1))
[['name', '01/03/2012', 'job'], ['name', '02/05/2013', 'job'], ['name', '03/08/2014', 'job']]
In your case it works, because your datestrings are in the correct format. It might still be prudent to convert them to datetime objects.
You have to convert str to datetime, because sorted, can't compare datetime and str.
datetime.strptime use to convert str to datetime object.
You can use list.sort on to sort on same list.
In [43]: li.sort(key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"))
In [44]: li
Out[44]:
[['name', '01/03/2012', 'job'],
 ['name', '02/05/2013', 'job'],
 ['name', '03/08/2014', 'job']]
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With