2

I have a list of dictionary objects (read from csv) that I want to sort. E.g.

l_data.sort(key=lamdba x: (x['fname'], x['lname']))

Now I want to make the code more flexible, and want to sort on the keys based on the input, something like:

def sort_data(l_data, keys):
    l_data.sort(key=lambda x: (x[d] for d in keys))
    ... ...

And I get the following error:

TypeError: unorderable types: generator() < generator()
vaultah
  • 44,105
  • 12
  • 114
  • 143
fivelements
  • 1,487
  • 2
  • 19
  • 32

2 Answers2

3

(x[d] for d in keys) is a generator expression (produces generator object). If you want to make a tuple, wrap that generator expression with tuple(...):

def sort_data(l_data, keys):
    l_data.sort(key=lambda x: tuple(x[d] for d in keys))
    # code

Though your code can be greatly simplified using operator.itemgetter:

from operator import itemgetter

def sort_data(l_data, keys):
    l_data.sort(key=itemgetter(*keys))
    # code
vaultah
  • 44,105
  • 12
  • 114
  • 143
0

You are trying to sort by the generator x[d] for d in keys, the output of the generator needs to be converted to a tuple first.

See here

Community
  • 1
  • 1
Robin Gertenbach
  • 10,316
  • 3
  • 25
  • 37