Сортировать список имен в Python, игнорируя числа? - PullRequest
4 голосов
/ 30 октября 2010
['7', 'Google', '100T', 'Chrome', '10', 'Python']

Я бы хотел, чтобы результатом были все числа в конце, а остальные отсортированы.Числа не нужно сортировать.

Chrome
Google
Python
100T
7
10

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

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

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

Ответы [ 2 ]

3 голосов
/ 30 октября 2010

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

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

sorted(get, key=sortkey)

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

1 голос
/ 30 октября 2010
>>> 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...