Відповіді:
Основна відповідь:
mylist = ["b", "C", "A"]
mylist.sort()
Це змінює ваш початковий список (тобто сортує на місці). Щоб отримати відсортовану копію списку, не змінюючи оригінал, використовуйте sorted()
функцію:
for x in sorted(mylist):
print x
Однак наведені вище приклади трохи наївні, тому що вони не враховують місцевість та виконують сортування залежно від регістру. Ви можете скористатися додатковим параметром, key
щоб вказати спеціальний порядок сортування (альтернативним варіантом cmp
є застаріле рішення, оскільки його доводиться оцінювати кілька разів - key
обчислюється лише один раз на кожен елемент).
Отже, для сортування відповідно до поточної локалі, враховуючи специфічні для мови правила ( cmp_to_key
це допоміжна функція від functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
І, нарешті, якщо вам потрібно, ви можете вказати власну локаль для сортування:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
Останнє зауваження: ви побачите приклади нечутливого до регістру сортування, в якому використовується lower()
метод - вони неправильні, оскільки вони працюють лише для підмножини ASCII. Ці два помиляються за будь-якими даними, які не є англійською мовою:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
mylist.sort(key=str.lower)
швидше.
[1, 2, 3].sort()
. Оскільки sort()
сортує список на місці (тобто змінює список безпосередньо), він не повертає відсортований список і насправді нічого не повертає, тому ваша друкована заява друкується None
. Якщо ви зберегли свій список до змінної, скажімо x
, називається x.sort()
, тоді print(x)
ви побачите відсортований список.
Також варто відзначити sorted()
функцію:
for x in sorted(list):
print x
Це повертає нову, відсортовану версію списку без зміни початкового списку.
Правильний спосіб сортування рядків:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']
# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']
Попередній приклад mylist.sort(key=lambda x: x.lower())
буде добре працювати в контекстах, призначених лише для ASCII.
Будь ласка, використовуйте сортовану () функцію в Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Але як це обробляє конкретні правила сортування для мови? Чи враховується це місцевість?
Ні, list.sort()
це загальна функція сортування. Якщо ви хочете сортувати за правилами Unicode, вам доведеться визначити функцію впорядкованого ключа сортування. Ви можете спробувати використовувати модуль pyuca , але я не знаю, наскільки він завершений.
Старе запитання, але якщо ви хочете зробити сортування з урахуванням локальних даних без встановлення, locale.LC_ALL
ви можете зробити це, використовуючи бібліотеку PyICU, як запропоновано цією відповіддю :
import icu # PyICU
def sorted_strings(strings, locale=None):
if locale is None:
return sorted(strings)
collator = icu.Collator.createInstance(icu.Locale(locale))
return sorted(strings, key=collator.getSortKey)
Потім зателефонуйте, наприклад:
new_list = sorted_strings(list_of_strings, "de_DE.utf8")
Це працювало для мене, не встановлюючи жодних локалів та не змінюючи інших системних налаштувань.
(Це вже було запропоновано в коментарі вище , але я хотів надати йому більшу популярність, бо спочатку я сам це пропустив.)
Або можливо:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Це просто: https://trinket.io/library/trinkets/5db81676e4
scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'
Scores = score.split (',') для x у сортованому (бали): print (x)
locale
і це методи рядкового зіставлення, щоб сортувати природним чином відповідно до поточної локалі.