How to sort list of String without considering Special characters andwith case insensitive

Discussion in 'Python' started by san, Nov 27, 2012.

  1. san

    san Guest

    Please let me know how to sort the list of String in either ascending / descending order without considering special characters and case.
    ex: list1=['test1_two','testOne','testTwo','test_one']
    Applying the list.sort /sorted method results in sorted list ['test1_two', 'testOne', 'testTwo', 'test_one']
    but the without considering the special characters and case it should be
    ['testOne','test_one', 'test1_two','testTwo'] OR ['test_one','testOne','testTwo', 'test1_two' ]

    list.sort /sorted method sorts based on the ascii value of the characters but Please let me knwo how do i achieve my expected one
    san, Nov 27, 2012
    #1
    1. Advertising

  2. san

    MRAB Guest

    Re: How to sort list of String without considering Special charactersand with case insensitive

    On 2012-11-27 17:31, san wrote:
    > Please let me know how to sort the list of String in either ascending / descending order without considering special characters and case.
    > ex: list1=['test1_two','testOne','testTwo','test_one']
    > Applying the list.sort /sorted method results in sorted list ['test1_two', 'testOne', 'testTwo', 'test_one']
    > but the without considering the special characters and case it should be
    > ['testOne','test_one', 'test1_two','testTwo'] OR ['test_one','testOne','testTwo', 'test1_two' ]
    >
    > list.sort /sorted method sorts based on the ascii value of the characters but Please let me knwo how do i achieve my expected one
    >

    (I'm using Python 3.)

    The .sort method accepts a 'key' argument, which lets you pass a
    function that transforms the value being sorted before comparison:

    >>> def make_key(string):

    return string.replace('_', '').upper()

    >>> list1 = ['test1_two', 'testOne', 'testTwo', 'test_one']
    >>> list1.sort(key=make_key)
    >>> list1

    ['test1_two', 'testOne', 'test_one', 'testTwo']

    I don't know how you define 'special'.

    You could remove any characters which are special or keep any
    characters which are not special, depending on how many characters are
    defined as 'special':

    from string import ascii_letters

    # Sets are faster for this kind of thing.
    ascii_letters = set(ascii_letters)

    def make_key(string):
    return ''.join(c for c in string if c in ascii_letters).upper()

    list1 = ['test1_two', 'testOne', 'testTwo', 'test_one']
    list1.sort(key=make_key)

    print(list1)

    # Output is: ['testOne', 'test_one', 'test1_two', 'testTwo']
    MRAB, Nov 27, 2012
    #2
    1. Advertising

  3. RE: How to sort list of String without considering Specialcharacters and with case insensitive

    san wrote:

    >
    > Please let me know how to sort the list of Stringin either ascending / descending order without considering
    > special characters and case.
    > ex: list1=['test1_two','testOne','testTwo','test_one']
    > Applying the list.sort /sorted method results in sorted list ['test1_two', 'testOne', 'testTwo', 'test_one']
    > but the without considering the special characters and case it should be
    > ['testOne','test_one', 'test1_two','testTwo'] OR ['test_one','testOne','testTwo', 'test1_two' ]
    >
    > list.sort /sorted method sorts based on the ascii value of the characters but Please let me knwo how do i
    > achievemy expected one


    You can pass a key function into list.sort() and sorted(). This
    allows you to customize the sorting. In the below examples
    I use lambda but you can use a non-lambda function (if youneed
    more complexity).

    Case insensitive searches are often done by converting the
    strings being compared into the same case. Here I turned
    them all uppercase.

    lst = ['test1_two', 'testOne', 'testTwo', 'test_one']
    lst.sort(key=lambda x: x.upper())

    This will filter non-alphanumeric characters. You may
    be able to create and use a translation table instead.

    lst.sort( key=lambda x: ''.join( c.upper() for c in x if c
    in string.letters+string.digits ) )


    ~Ramit



    This email is confidential and subject to important disclaimers and
    conditions including on offers for the purchase or sale of
    securities, accuracy and completeness of information, viruses,
    confidentiality, legal privilege, and legal entity disclaimers,
    available at http://www.jpmorgan.com/pages/disclosures/email.
    Prasad, Ramit, Nov 27, 2012
    #3
    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. Tee
    Replies:
    3
    Views:
    7,766
    Herfried K. Wagner [MVP]
    Jun 23, 2004
  2. Replies:
    1
    Views:
    2,457
    Mark P
    Apr 6, 2007
  3. Nico Grubert
    Replies:
    2
    Views:
    323
    Florian Diesch
    Jan 13, 2010
  4. Nico Grubert
    Replies:
    2
    Views:
    320
    Stefan Behnel
    Jan 13, 2010
  5. Nico Grubert
    Replies:
    2
    Views:
    373
    Peter Otten
    Jan 13, 2010
Loading...

Share This Page