Як сортувати список рядків?


417

Який найкращий спосіб створити алфавітно відсортований список у Python?


1
Використовуйте, localeі це методи рядкового зіставлення, щоб сортувати природним чином відповідно до поточної локалі.
u0b34a0f6ae

Відповіді:


519

Основна відповідь:

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)

37
mylist.sort(key=str.lower)швидше.
jfs

1
Гарна думка. Я залишу свій сьогоднішній приклад таким, як є, оскільки початківцю, мабуть, простіше бачити, що відбувається, але я пам’ятатиму про це в майбутньому.
Eli Courtwright

1
Якщо комусь цікаво, виступ списку.sort () можна знайти тут
Харі Ганесан

1
@BornToCode: 1- я знаю . Подивіться на ревізію (2008 р.), На яку відповідають мої коментарі (мій коментар стосується зайвого використання лямбда). 2- сортування символів, що не належать до ASCII, є великою окремою темою. PyICU можна використовувати замість локального рішення.
jfs

1
@Dmitry Це тому, що ви друкуєте повернене значення функції сортування, яку викликається [1, 2, 3].sort(). Оскільки sort()сортує список на місці (тобто змінює список безпосередньо), він не повертає відсортований список і насправді нічого не повертає, тому ваша друкована заява друкується None. Якщо ви зберегли свій список до змінної, скажімо x, називається x.sort(), тоді print(x)ви побачите відсортований список.
bjg222

56

Також варто відзначити sorted()функцію:

for x in sorted(list):
    print x

Це повертає нову, відсортовану версію списку без зміни початкового списку.



18

Правильний спосіб сортування рядків:

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.


13

Будь ласка, використовуйте сортовану () функцію в Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

Але як це обробляє конкретні правила сортування для мови? Чи враховується це місцевість?

Ні, list.sort()це загальна функція сортування. Якщо ви хочете сортувати за правилами Unicode, вам доведеться визначити функцію впорядкованого ключа сортування. Ви можете спробувати використовувати модуль pyuca , але я не знаю, наскільки він завершений.


1

Старе запитання, але якщо ви хочете зробити сортування з урахуванням локальних даних без встановлення, 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")

Це працювало для мене, не встановлюючи жодних локалів та не змінюючи інших системних налаштувань.

(Це вже було запропоновано в коментарі вище , але я хотів надати йому більшу популярність, бо спочатку я сам це пропустив.)


0

Припустимо s = "ZWzaAd"

Для сортування вище рядка просте рішення буде нижче одного.

print ''.join(sorted(s))

це не перелік рядків, які ви тут
сортуєте

0

Або можливо:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Результат

['abc', 'ba', 'cd', 'dc', 'xy']


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.