كيفية فرز قائمة من السلاسل ؟
سؤال
ما هي أفضل طريقة لإقامة فرز حسب الترتيب الأبجدي قائمة في الثعبان ؟
المحلول
الأساسية الجواب:
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)
نصائح أخرى
ومن الجدير بالذكر أيضا sorted()
وظيفة:
for x in sorted(list):
print x
هذا يعود جديدة فرز نسخة من قائمة دون تغيير القائمة الأصلية.
list.sort()
هو حقا بهذه البساطة :)
الطريقة الصحيحة لفرز سلاسل هي:
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-فقط السياقات.
ولكن كيف هذا التعامل مع اللغة المحددة الفرز القواعد ؟ يستغرق لغة في الاعتبار ؟
لا ، list.sort()
هو عام وظيفة الفرز.إذا كنت ترغب في فرز وفقا Unicode القواعد ، عليك أن تحدد نوع مخصص الوظيفة الرئيسية.يمكنك محاولة استخدام pyuca وحدة, ولكن أنا لا أعرف كيف أكمل هو.
الرجاء استخدام فرز() وظيفة في Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
لنفترض s = "ZWzaAd"
لفرز فوق سلسلة الحل بسيط سوف يكون أقل من واحد.
print ''.join(sorted(s))
أو ربما:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))