2010-10-30 6 views
4
['7', 'Google', '100T', 'Chrome', '10', 'Python'] 

Я хотел бы, чтобы результат был все номера в конце, а остальные отсортированы. Номера не нужно сортировать.
Сортировать список имен в Python, игнорируя номера?

Chrome 
Google 
Python 
100T 
7 
10 

Это немного сложнее, хотя, потому что я отсортировать словарь по значению.

def sortname(k): return get[k]['NAME'] 
sortedbyname = sorted(get,key=sortname) 

Я только добавил 100T после оба ответа были опубликованы уже, но принятый ответ до сих пор работает с небольшими изменениями я писал в комментарии. Чтобы уточнить, имя, соответствующее^[^ 0-9], должно быть отсортировано.

+0

не является словарем питона неупорядоченного? –

+0

@Lie Ryan: он неупорядочен, поэтому его нужно сортировать;) Создание сортированного словаря невозможно (за исключением использования OrderedDict), но он сортирует список имен (которые происходят из вложенного dict). – delnan

+0

Хорошо, с добавленным примером ... Каково ваше определение «это число»? «Начинается с цифр»? – delnan

ответ

3

Я изо всех сил, чтобы получить словарь версии работает, так вот версия массива для вас экстраполировать:

def sortkey(x): 
    try: 
     return (1, int(x)) 
    except: 
     return (0, x) 

sorted(get, key=sortkey) 

Основной принцип заключается в том, чтобы создать кортеж, который первый элемент имеет эффект группировки все строки вместе, то все ints. К сожалению, нет никакого изящного способа подтвердить, является ли строка случаем int без использования исключений, что не так хорошо внутри лямбда. Мое первоначальное решение использовало регулярное выражение, но, перейдя от лямбды к автономной функции, я подумал, что я мог бы пойти по простому варианту.

+0

+1 отличное решение. – delnan

+0

не будут ли эти цифры номерами? –

+0

Что случилось с функцией str.isdigit()? http://docs.python.org/library/stdtypes.html#str.isdigit –

1
>>> l = ['7', 'Google', 'Chrome', '10', 'Python'] 
>>> sorted(l, key=lambda s: (s.isdigit(), s)) 
['Chrome', 'Google', 'Python', '10', '7'] 

рода Python является стабильным, так что вы можете также использовать несколько последовательных виды:

>>> m = sorted(l) 
>>> m.sort(key=str.isdigit) 
>>> m 
['Chrome', 'Google', 'Python', '10', '7'] 
+0

-1 Это решение не будет работать с примером, предложенным OP. '100T' не состоит только из цифр, но, видимо, его не нужно сортировать (а также чистые числа). –

+0

@Guilio: Не очень приятно проголосовать за кого-то, потому что их ответ не распространяется на измененный вопрос. – Thilo

+1

@ Тило, извините, я не понял, что этот пример был отредактирован/добавлен позже. Я бы отменил голосование, если это было возможно (теперь заблокировано, если ответ не изменен). –

Смежные вопросы