best Pythonic way to do this sort: Python newb

Discussion in 'Python' started by Sean Berry, Oct 10, 2005.

  1. Sean Berry

    Sean Berry Guest

    Hello all

    I have build a list that contains data in the form below
    -- simplified for question --
    myList = [[value1, value2, value3],[value1, value2, value3], ...]

    I have a function which takes value3 from the lists above and returns
    another value. I want to use this returned value to sort the lists.

    So, my resultant list would be ordered by the return value of the
    function with value3 as its argument.

    From a relative Python newb, what is the best way to do this?

    Thanks for any help offered.
     
    Sean Berry, Oct 10, 2005
    #1
    1. Advertising

  2. Sean Berry

    Paul Rubin Guest

    "Sean Berry" <> writes:
    > myList = [[value1, value2, value3],[value1, value2, value3], ...]
    >
    > I have a function which takes value3 from the lists above and returns
    > another value. I want to use this returned value to sort the lists.
    >
    > So, my resultant list would be ordered by the return value of the
    > function with value3 as its argument.
    >
    > From a relative Python newb, what is the best way to do this?


    def get_key(x): return x[2]
    sorted_list = sorted(myList, key=get_key)
     
    Paul Rubin, Oct 10, 2005
    #2
    1. Advertising

  3. Sean Berry

    Sean Berry Guest

    "Paul Rubin" <http://> wrote in message
    news:...
    > "Sean Berry" <> writes:
    >> myList = [[value1, value2, value3],[value1, value2, value3], ...]
    >>
    >> I have a function which takes value3 from the lists above and returns
    >> another value. I want to use this returned value to sort the lists.
    >>
    >> So, my resultant list would be ordered by the return value of the
    >> function with value3 as its argument.
    >>
    >> From a relative Python newb, what is the best way to do this?

    >
    > def get_key(x): return x[2]
    > sorted_list = sorted(myList, key=get_key)


    Sorry if I am missing something. But. what is sorted here?

    My simplified function looks like this

    def myFunction( myNumber ):
    "do some math calculations to myNumber"
    return "result of calculations"

    So, I want to sort myList by the return of myFunction( value3 )

    I tried doing the following... with no luck so far
    myList.sort(lambda x, y: cmp(myFunction(x[2]), myFunction(y[2]))

    Thanks for any help.
     
    Sean Berry, Oct 10, 2005
    #3
  4. Sean Berry

    Paul Rubin Guest

    "Sean Berry" <> writes:
    > > def get_key(x): return x[2]
    > > sorted_list = sorted(myList, key=get_key)

    >
    > Sorry if I am missing something. But. what is sorted here?


    sorted is a built-in function that sorts the thing that you pass it.
    It just appeared in Python 2.4, I think. With older versions, yeah,
    you have to use the .sort method that sorts in place.

    > I tried doing the following... with no luck so far
    > myList.sort(lambda x, y: cmp(myFunction(x[2]), myFunction(y[2]))


    That looks ok to me.

    >>> x = [(i,i*i,1 + 17*i**2 - i**3) for i in range(20)]
    >>> x

    [(0, 0, 1), (1, 1, 17), (2, 4, 61), (3, 9, 127), (4, 16, 209), (5, 25,
    301), (6, 36, 397), (7, 49, 491), (8, 64, 577), (9, 81, 649), (10,
    100, 701), (11, 121, 727), (12, 144, 721), (13, 169, 677), (14, 196,
    589), (15, 225, 451), (16, 256, 257), (17, 289, 1), (18, 324, -323),
    (19, 361, -721)]
    >>> x.sort(lambda a,b:cmp(a[2],b[2]))
    >>> x

    [(19, 361, -721), (18, 324, -323), (0, 0, 1), (17, 289, 1), (1, 1,
    17), (2, 4, 61), (3, 9, 127), (4, 16, 209), (16, 256, 257), (5, 25,
    301), (6, 36, 397), (15, 225, 451), (7, 49, 491), (8, 64, 577), (14,
    196, 589), (9, 81, 649), (13, 169, 677), (10, 100, 701), (12, 144,
    721), (11, 121, 727)]
    >>>
     
    Paul Rubin, Oct 10, 2005
    #4
  5. (sorted is a built-in function in 2.4)

    def myFunction( data ):
    """ Take one of your set of 3, grab [2] (the 3rd) and do calcs,
    return value """
    "do some math calculations to data[2]"
    return "result of calculations"

    sorted_list = sorted(myList, key=myFunction)

    List is sorted in the order of the 'key' values, key being a value
    returned from myFunction which operates on [2].
     
    Brett Hoerner, Oct 10, 2005
    #5
  6. ----
    Satchidanand Haridas (sharidas at zeomega dot com)

    ZeOmega (www.zeomega.com)
    Open Minds' Open Solutions



    Sean Berry wrote:

    >"Paul Rubin" <http://> wrote in message
    >news:...
    >
    >
    >>"Sean Berry" <> writes:
    >>
    >>
    >>>myList = [[value1, value2, value3],[value1, value2, value3], ...]
    >>>
    >>>I have a function which takes value3 from the lists above and returns
    >>>another value. I want to use this returned value to sort the lists.
    >>>
    >>>So, my resultant list would be ordered by the return value of the
    >>>function with value3 as its argument.
    >>>
    >>>From a relative Python newb, what is the best way to do this?
    >>>
    >>>

    >>def get_key(x): return x[2]
    >>sorted_list = sorted(myList, key=get_key)
    >>
    >>

    >
    >Sorry if I am missing something. But. what is sorted here?
    >
    >My simplified function looks like this
    >
    >def myFunction( myNumber ):
    > "do some math calculations to myNumber"
    > return "result of calculations"
    >
    >So, I want to sort myList by the return of myFunction( value3 )
    >
    >I tried doing the following... with no luck so far
    >myList.sort(lambda x, y: cmp(myFunction(x[2]), myFunction(y[2]))
    >
    >
    >

    I think the above statement should be as follows:

    myList.sort(lambda x, y: cmp(myFunction(x[2]) - myFunction(y[2]))



    hope that helps.

    regards,
    Satchit
     
    Satchidanand Haridas, Oct 10, 2005
    #6
  7. "Satchidanand Haridas" <> wrote:

    > >So, I want to sort myList by the return of myFunction( value3 )
    > >
    > >I tried doing the following... with no luck so far
    > >myList.sort(lambda x, y: cmp(myFunction(x[2]), myFunction(y[2]))
    > >
    > >
    > >

    > I think the above statement should be as follows:
    >
    > myList.sort(lambda x, y: cmp(myFunction(x[2]) - myFunction(y[2]))
    >
    >
    >
    > hope that helps.


    It would help more if you tested it before you posted. cmp takes two arguments (let alone that
    subtraction may not be defined for the list elements), so the original version is correct.

    George
     
    George Sakkis, Oct 10, 2005
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Carl J. Van Arsdall
    Replies:
    4
    Views:
    503
    Bruno Desthuilliers
    Feb 7, 2006
  2. pythonic way to sort

    , May 4, 2006, in forum: Python
    Replies:
    3
    Views:
    293
    Boris Borcic
    May 4, 2006
  3. Replies:
    5
    Views:
    369
    John Machin
    Jun 12, 2006
  4. sajuptpm
    Replies:
    7
    Views:
    814
    Terry Reedy
    Sep 8, 2010
  5. Navin
    Replies:
    1
    Views:
    710
    Ken Schaefer
    Sep 9, 2003
Loading...

Share This Page