Merhaba,
Fırat Özgül Python 3 kitabında sf.239’da sorted() fonksiyonunun Türkçe karakterleri sıralaması için anlatılan yöntem hata veriyor. Ubuntu 16.04’le gelen python 3.5 ve anaconda 3.6 paketlerinin ikisini de denedim. Kabukta da hata veriyor. Pycarm IDE ile de hata alıyorum.
önce şu modülü yüklüyorum:
import locale
locale.setlocale(locale.LC_ALL,"tr_TR") #GNU/Linux için
print(sorted("çiçek", key=locale.strxfrm))
çalıştırınca:
Traceback (most recent call last):
File “/home/orion/Dropbox/PROGRAMLAMA/Python_Projects/Python-3_F_Ozdil_Notlar/bolum16_karakter_dizi.py”, line 42, in
locale.setlocale(locale.LC_ALL,“tr_TR”)
File “/usr/lib/python3.5/locale.py”, line 594, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
söylediği locale.py dosyasında belirttiği satırda böyle bir şeyler var. Bir tanımlama sanırım.
def setlocale(category, locale=None):
""" Set the locale for the given category. The locale can be
a string, an iterable of two strings (language code and encoding),
or None.
Iterables are converted to strings using the locale aliasing
engine. Locale strings are passed directly to the C lib.
category may be given as one of the LC_* values.
"""
if locale and not isinstance(locale, _builtin_str):
# convert to string
locale = normalize(_build_localename(locale))
return _setlocale(category, locale)
şunu da denedim (tabi kitapta yok): locale.setlocale(locale.LC_ALL, locale="tr_TR")
Yukarıda önerilen yöntemler işe yaramazsa aşağıdakini bir deneyin:
sudo apt-get install language-pack-tr
sudo dpkg-reconfigure locales # *
# *: Karşınıza çıkan menüde All Locales seçeneği seçilmemişse
# onu seçin ve "ok" tuşuna basın.
# Daha sonra karşınıza başka bir menü çıkar,
# menüde "tr_TR.utf.8" seçilmemişse
# seçin ve "ok" tuşuna basın.
~$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
tr_TR.utf8
bunlar var.
dediğiniz gibi locale.setlocale(locale.LC_ALL,locale="tr_TR.utf8")
veya locale.setlocale(locale.LC_ALL,"tr_TR.utf8")
yapınca oldu. Ama bu fonksiyondan soğudum. Yani yazdığım programın karşı tarafta çalışıp çalışmadığına emin olamam :S.
Neden farklı acaba?
Yani
locale.py içinde tanımladığı aliases’lara baktığımda “tr_TR” görüyorum. Kütüphane ile ilgili bir sorun sanmıştım.
Kitapta bu yöntem tek bir yerde işe yaramaz diyor. Ama ben dediğiniz paketleri yükleyince “ı” harfini “i” harfinden önceye aldı. Yani doğru çalıştı. Burada da garip bir durum var. Acaba paketler üzerinde güncelleme mi oldu? Bu arada çok teşekkürler…
sorted(“çiçek”, key=locale.strxfrm)
Burada sorted() metodunun key adlı özel bir parametresine locale.strxfrm değerini vererek
Türkçeye duyarlı bir sıralama yapılmasını sağladık. Yukarıdaki yöntem pek çok durumda
işinize yarar. Ancak bu yöntem tek bir yerde işe yaramaz. Dikkatlice bakın:
sorted(“afgdhkıi”, key=locale.strxfrm)
[‘a’, ‘d’, ‘f’, ‘g’, ‘h’, ‘i’, ‘ı’, ‘k’]
Listeniz niye bu kadar kısa iki; tr_TR niye yok bu listede, bunları düşünüyorum. Bu yüzden son yöntemi denediniz mi diye sordum, son yöntemden sonra tr_TR listede görünmeye başladı mı merak etmiştim.
Merhaba. Bu çözüm linux için anlatılmış. Acaba windows 10 / PyCharm ortamında nasıl yapabiliriz? Bende de aynı problem var. ı ve i harflerini ters sıralıyor. i yi önce yazıyor. Teşekkürler.
Merhaba. Karşılaştığınız sorunla ilgili olarak YazBel belgelerinde şöyle bir çözüm yolu önerilmiştir:
Burada sorted() metodunun key adlı özel bir parametresine locale.strxfrm değerini vererek Türkçe’ye duyarlı bir sıralama yapılmasını sağladık. Yukarıdaki yöntem pek çok durumda işinize yarar. Ancak bu yöntem tek bir yerde işe yaramaz. Dikkatlice bakın:
sorted("afgdhkıi", key=locale.strxfrm)
['a', 'd', 'f', 'g', 'h', 'i', 'ı', 'k']
Gördüğünüz gibi, bu yöntem ‘i’ harfini ‘ı’ harfinden önce getiriyor. Halbuki Türk alfabesine göre bunun tersi olmalıydı. Buna benzer problemlerle İngiliz alfabesi dışındaki pek çok alfabede karşılaşırsınız. Dolayısıyla bu sadece Türkçe’ye özgü bir sorun değil.
Bu soruna karşı şöyle bir kod da yazabilirsiniz:
harfler = "abcçdefgğhıijklmnoöprsştuüvyz" çevrim = {i: harfler.index(i) for i in harfler} sorted("afgdhkıi", key=çevrim.get)