2012-05-19 4 views
0

Вот проблема, я использую функцию sorted, чтобы упорядочить список буквенно-цифровых строк. Указанные строки должны содержать числа в них, разделенные буквой.Python сортируется со списком буквенно-цифровых строк?

Например: sortqns(['s1q1', 's10q1', 's1q2', 's10q10', 's10q2'])

def cmpqn(a, b): 
    if len(a) > len(b): 
     return 1 
    if len(a) < len(b): 
     return -1 
    if len(a) == len(b): 
     return 0 

def sortqns(qnlist): 
    new = sorted(qnlist, cmp=cmpqn) 
    return new 

Возвращения ['s1q1', 's1q2', 's10q1', 's10q2', 's10q10']

Моя проблема сортировки вторую цифру:

sortqns(['s12q1', 's1q2', 's1q1']) 

Returns ['s1q2', 's1q1', 's12q1'] 

Вместо:

Returning ['s1q1', 's1q2', 's12q1'] 

В первом примере мое желаемое возвращение было бы отключено, если бы и первые два элемента были заменены.

ответ

5

Алгоритм сортировки в списке стабилен. Стабильные алгоритмы сортировки поддерживают относительный порядок записей с равными ключами. Поэтому в вашем коде, когда два элемента имеют одинаковую длину, они будут отображаться в результате, сохраняя относительный порядок.

Я думаю, что следующее решение полезно.

def sortqns(qnlist): 
    return sorted(qnlist, key = lambda x: (len(x), x)) 
+0

Использование функции 'key', а не' cmp' также более эффективно (поскольку функция называется только «O (n)» раз, а не «O (n * log (n)), 'раз). – Blckknght

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