2015-06-13 2 views
-1

Я новичок в Python, и мне трудно решить это. Я пытаюсь сортировать список, чтобы иметь возможность его сортировать 1) по первому числу и 2) по второму числу. Я хотел бы иметь что-то вроде этого:Сортировка с двумя цифрами в строке - Python

'1-1bird' 
'1-1mouse' 
'1-1nmouses' 
'1-2mouse' 
'1-2nmouses' 
'1-3bird' 
'10-1birds' 
(...) 

Эти цифры могут быть от 1 до 99 ех: 99-99bird возможно. Это код, который у меня после пары головных болей. Возможность сортировки по следующему первому письму будет бонусом.
Вот что я пробовал:

#!/usr/bin/python 


myList = list() 
myList = ['1-10bird', '1-10mouse', '1-10nmouses', '1-10person', '1-10cat', '1-11bird', '1-11mouse', '1-11nmouses', '1-11person', '1-11cat', '1-12bird', '1-12mouse', '1-12nmouses', '1-12person', '1-13mouse', '1-13nmouses', '1-13person', '1-14bird', '1-14mouse', '1-14nmouses', '1-14person', '1-14cat', '1-15cat', '1-1bird', '1-1mouse', '1-1nmouses', '1-1person', '1-1cat', '1-2bird', '1-2mouse', '1-2nmouses', '1-2person', '1-2cat', '1-3bird', '1-3mouse', '1-3nmouses', '1-3person', '1-3cat', '2-14cat', '2-15cat', '2-16cat', '2-1bird', '2-1mouse', '2-1nmouses', '2-1person', '2-1cat', '2-2bird', '2-2mouse', '2-2nmouses', '2-2person'] 


def mysort(x,y): 
x1="" 
y1="" 

for myletter in x : 
    if myletter.isdigit() or "-" in myletter: 
     x1=x1+myletter 

x1 = x1.split("-") 

for myletter in y : 
    if myletter.isdigit() or "-" in myletter: 
     y1=y1+myletter 

y1 = y1.split("-") 


if x1[0]>y1[0]: 
    return 1 
elif x1[0]==y1[0]: 
    if x1[1]>y1[1]: 
     return 1 
    elif x1==y1: 
     return 0 
    else : 
     return -1 
else : 
    return -1 




myList.sort(mysort) 
print myList 

Спасибо!

Martin

+0

ли вы пройти, если кто-то лань s это задание для вас в Stackoverflow? –

ответ

0

У вас есть хорошие идеи с расщеплением на '-' и используя isalpha() и isdigit(), но тогда мы будем использовать те создать функцию, которая принимает в качестве элемента и возвращает «чистую» версию элемента , которые можно легко отсортировать. Он создаст трехзначное нулевое представление первого числа, затем аналогичное со вторым номером, затем часть «слово» (а не только первый символ). Результат выглядит примерно так: "001001bird" (который не будет отображаться - он будет использоваться только внутри). Встроенная функция sorted() будет использовать эту функцию обратного вызова в качестве ключа, принимая каждый элемент, передавая его обратному вызову и основывая порядок сортировки на возвращаемое значение. В тесте я использую оператор * и аргумент sep для его печати без необходимости создания цикла, но цикл также отлично подходит.

def callback(item): 
    phrase = item.split('-') 
    first = phrase[0].rjust(3, '0') 
    second = ''.join(filter(str.isdigit, phrase[1])).rjust(3, '0') 
    word = ''.join(filter(str.isalpha, phrase[1])) 
    return first + second + word 

Тест:

>>> myList = ['1-10bird', '1-10mouse', '1-10nmouses', '1-10person', '1-10cat', '1-11bird', '1-11mouse', '1-11nmouses', '1-11person', '1-11cat', '1-12bird', '1-12mouse', '1-12nmouses', '1-12person', '1-13mouse', '1-13nmouses', '1-13person', '1-14bird', '1-14mouse', '1-14nmouses', '1-14person', '1-14cat', '1-15cat', '1-1bird', '1-1mouse', '1-1nmouses', '1-1person', '1-1cat', '1-2bird', '1-2mouse', '1-2nmouses', '1-2person', '1-2cat', '1-3bird', '1-3mouse', '1-3nmouses', '1-3person', '1-3cat', '2-14cat', '2-15cat', '2-16cat', '2-1bird', '2-1mouse', '2-1nmouses', '2-1person', '2-1cat', '2-2bird', '2-2mouse', '2-2nmouses', '2-2person'] 
>>> print(*sorted(myList, key=callback), sep='\n') 
1-1bird 
1-1cat 
1-1mouse 
1-1nmouses 
1-1person 
1-2bird 
1-2cat 
1-2mouse 
1-2nmouses 
1-2person 
1-3bird 
1-3cat 
1-3mouse 
1-3nmouses 
1-3person 
1-10bird 
1-10cat 
1-10mouse 
1-10nmouses 
1-10person 
1-11bird 
1-11cat 
1-11mouse 
1-11nmouses 
1-11person 
1-12bird 
1-12mouse 
1-12nmouses 
1-12person 
1-13mouse 
1-13nmouses 
1-13person 
1-14bird 
1-14cat 
1-14mouse 
1-14nmouses 
1-14person 
1-15cat 
2-1bird 
2-1cat 
2-1mouse 
2-1nmouses 
2-1person 
2-2bird 
2-2mouse 
2-2nmouses 
2-2person 
2-14cat 
2-15cat 
2-16cat 
0

Вам необходимо ведущие нули. Строки сортируются в алфавитном порядке, причем порядок отличается от порядка цифр. Он должен быть

'01-1bird' 
'01-1mouse' 
'01-1nmouses' 
'01-2mouse' 
'01-2nmouses' 
'01-3bird' 
'10-1birds' 

Как вы видите 1 идет после 0.

0

Другие ответы здесь очень респектабельно, я уверен, но для полного кредита вы должны убедиться, что ваш ответ умещается на одной линии и использует столько списковых, насколько это возможно:

import itertools 
[''.join(r) for r in sorted([[''.join(x) for _, x in 
      itertools.groupby(v, key=str.isdigit)] 
      for v in myList], key=lambda v: (int(v[0]), int(v[2]), v[3]))] 

Это должно сделать красиво:

['1-1bird', 
'1-1cat', 
'1-1mouse', 
'1-1nmouses', 
'1-1person', 
'1-2bird', 
'1-2cat', 
'1-2mouse', 
... 
'2-2person', 
'2-14cat', 
'2-15cat', 
'2-16cat'] 
Смежные вопросы