Dizelerin listesi nasıl sıralanır?


417

Python'da alfabetik olarak sıralanmış bir liste oluşturmanın en iyi yolu nedir?


1
localeMevcut yerel ayara göre doğal olarak sıralamak için kullanın ve dize harmanlama yöntemlerini kullanın.
u0b34a0f6ae

Yanıtlar:


519

Temel cevap:

mylist = ["b", "C", "A"]
mylist.sort()

Bu, orijinal listenizi değiştirir (örn. Yerinde sıralar). Orijinali değiştirmeden listenin sıralı bir kopyasını almak için şu sorted()işlevi kullanın :

for x in sorted(mylist):
    print x

Bununla birlikte, yukarıdaki örnekler biraz naiftir, çünkü yerel ayarları dikkate almazlar ve büyük / küçük harfe duyarlı bir sıralama gerçekleştirirler. keyÖzel sıralama düzenini belirtmek için isteğe bağlı parametreden yararlanabilirsiniz (alternatif, cmpbirden çok kez değerlendirilmesi gerektiği için kullanımdan kaldırılmış bir çözümdür - keyöğe başına yalnızca bir kez hesaplanır).

Bu nedenle, geçerli yerel ayara göre sıralamak, dile özgü kuralları dikkate alarak ( cmp_to_keyfunctools'un yardımcı bir işlevidir):

sorted(mylist, key=cmp_to_key(locale.strcoll))

Son olarak, gerekirse, sıralama için özel bir yerel ayar belirtebilirsiniz :

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']

Son not: lower()yöntemi kullanan büyük / küçük harfe duyarsız sıralama örnekleri görürsünüz - bunlar yanlıştır, çünkü yalnızca karakterlerin ASCII alt kümesi için çalışırlar. Bu ikisi İngilizce olmayan veriler için yanlıştır:

# 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)daha hızlı.
jfs

1
İyi bir nokta. Mevcut örneğimi olduğu gibi bırakacağım, çünkü yeni başlayanların neler olduğunu görmesi daha kolay, ancak gelecekte bunu aklımda tutacağım.
Eli Courtwright

1
Merak eden varsa, list.sort () performansı burada
Hari Ganesan

1
@BornToCode: 1- Biliyorum . Yorumumun yanıtladığı revizyona (2008) bakın (yorumum lambda'nın gereksiz kullanımı hakkındadır). 2- ASCII olmayan karakterleri sıralamak ayrı bir konudur. Yerel ayar tabanlı çözüm yerine PyICU kullanılabilir .
jfs

1
@Dmitry Bunun nedeni, çağrılan sıralama işlevinin dönüş değerini yazdırmanızdır [1, 2, 3].sort(). Gibi sort()türlü yerinde listesi (yani doğrudan listeyi değiştirir), bu sıralı liste dönmek ve aslında bir şey dönmez, yazdırma deyimi baskılar öylesine vermez None. Listenizi diyelim x, çağrılan bir değişkene kaydettiyseniz x.sort(),print(x) , sen sıralı bir liste görecekti.
bjg222

56

Ayrıca sorted()işlevi belirtmeye değer :

for x in sorted(list):
    print x

Bu, orijinal listeyi değiştirmeden listenin yeni, sıralanmış bir sürümünü döndürür.



18

Dizeleri sıralamanın doğru yolu:

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']

Önceki örneği mylist.sort(key=lambda x: x.lower())yalnızca ASCII bağlamları için iyi çalışır.


13

Lütfen Python3'te sort () işlevini kullanın

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

10

Ancak bu, dile özgü sıralama kurallarını nasıl işler? Yerel ayarları dikkate alıyor mu?

Hayır, list.sort()genel bir sıralama işlevidir. Unicode kurallarına göre sıralamak istiyorsanız, özel bir sıralama tuşu işlevi tanımlamanız gerekir. Pyuca modülünü kullanmayı deneyebilirsiniz , ancak ne kadar eksiksiz olduğunu bilmiyorum.


1

Eski soru, ancak ayar yapmadan yerel ayarlara uygun sıralama locale.LC_ALL yapmak istiyorsanız, bu cevabın önerdiği şekilde PyICU kütüphanesini kullanarak bunu yapabilirsiniz :

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)

Sonra örneğin:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Bu, herhangi bir yerel ayar yüklemeden veya diğer sistem ayarlarını değiştirmeden benim için çalıştı.

(Bu zaten yukarıdaki bir yorumda önerildi , ancak daha fazla önem vermek istedim, çünkü ilk başta kendimi özledim.)


0

varsaymak s = "ZWzaAd"

Dizenin üzerinde sıralamak için basit çözüm birin altında olacaktır.

print ''.join(sorted(s))


0

Ya da belki:

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)

Sonuç

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


0

Çok basit: 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'

score = x için sıralanmış (puan) olarak split (','): yazdır (x)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.