2013-10-27 22 views
11

Próbuję wyświetlić niektóre wyniki w czytelny dla człowieka sposób. Na potrzeby tego pytania niektóre z nich to liczby, niektóre to litery, a niektóre to połączenie tych dwóch.Uporządkuj wyniki nie leksykograficznie?

Próbuję dowiedzieć się, w jaki sposób mogę je uporządkować tak:

input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance'] 
sorted_input = sorted(input) 
print(sorted_input) 

Pożądane Wyniki:

['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello'] 

Rzeczywiste wyniki:

['0', '1', '10', '100', '2', '3', 'Allowance', 'Hello'] 

I Mam problem z tym, jak to zrobić.

+1

możliwe duplikat [Does Python posiada wbudowaną funkcję STRING naturalnym rodzaju?] (Http://stackoverflow.com/questions/4836710/does- python-have-a-built-in-function-for-string-natural-sort) –

Odpowiedz

11

1 - instalacja modułu użycia natsort

pip install natsort 

2 - Zaimportuj natsorted

>>> input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance'] 

>>> from natsort import natsorted 
>>> natsorted(input) 
['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello'] 

Źródło: https://pypi.python.org/pypi/natsort

+0

Nice. Po co rozwiązywać problem, który został już rozwiązany? – jpmc26

+0

Awesome - dokładnie tego potrzebowałem! – user2923558

+2

Link https://github.com/SethMMorton/natsort –

1

to to zrobi. Dla celów porównawczych, przekształca ciągi może być zamienione na całkowitą do tej liczby całkowitej, i pozostawia inne ciągi sam:

def key(s): 
    try: 
     return int(s) 
    except ValueError: 
     return s 

sorted_input = sorted(input, key=key) 
+0

Myślę, że tęskniłeś za tą częścią "niektóre są kombinacją dwóch.". Również nie będzie działać w Pythonie3, ponieważ "typy nie podlegające unorderowaniu" –

+1

Nie, widziałem to, ale ignorowałem, ponieważ nie powiedziały ani słowa o tym, co chcieli w tym przypadku ;-) –

+3

"W obliczu niejednoznaczności odmów pokusa do odgadnięcia. " Powinienem był wiedzieć lepiej :) –

0

dla konkretnego przypadku:

def mySort(l): 
    numbers = [] 
    words = [] 
    for e in l: 
     try: 
      numbers.append(int(e)) 
     except: 
      words.append(e) 
    return [str(i) for i in sorted(numbers)] + sorted(words) 

print mySort(input) 
0

Można podzielić listę, sortowanie, a następnie umieścić go z powrotem razem. Spróbuj czegoś takiego:

numbers = sorted(int(i) for i in input_ if i.isdigit()) 
nonnums = sorted(i for i in input_ if not i.isdigit()) 
sorted_input = [str(i) for i in numbers] + nonnums 

Musisz zrobić coś bardziej skomplikowanego niż isdigit jeśli można mieć non-całkowitymi.

Jeśli to nie oznacza, że ​​"niektóre z nich stanowią połączenie dwóch elementów", proszę wyjaśnić, co to oznacza i jakich wyników oczekuje się od nich.

(nie testowane, ale powinien przekazać ideę.)