سؤال

ما هي أفضل طريقة لإقامة فرز حسب الترتيب الأبجدي قائمة في الثعبان ؟

هل كانت مفيدة؟

المحلول

الأساسية الجواب:

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()))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top