तार की एक सूची को कैसे सॉर्ट करें?


417

पायथन में वर्णानुक्रम में क्रमबद्ध सूची बनाने का सबसे अच्छा तरीका क्या है?


1
localeवर्तमान लोकेल के अनुसार स्वाभाविक रूप से सॉर्ट करने के लिए स्ट्रिंग कोलिंग मेथड्स का उपयोग करें और इसे करें ।
u0b34a0f6ae

जवाबों:


519

मूल उत्तर:

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

यह आपकी मूल सूची को संशोधित करता है (जैसे कि जगह में)। सूची की एक हल की प्रतिलिपि प्राप्त करने के लिए, मूल को बदले बिना, sorted()फ़ंक्शन का उपयोग करें :

for x in sorted(mylist):
    print x

हालाँकि, ऊपर दिए गए उदाहरण थोड़े भोले हैं, क्योंकि वे लोकेल को ध्यान में नहीं रखते हैं, और केस-सेंसिटिव सॉर्टिंग करते हैं। आप keyकस्टम सॉर्टिंग ऑर्डर को निर्दिष्ट करने के लिए वैकल्पिक पैरामीटर का लाभ उठा सकते हैं (विकल्प, उपयोग करना cmp, एक पदावनत समाधान है, क्योंकि इसका कई बार मूल्यांकन किया जाना है - keyकेवल एक बार तत्व के अनुसार गणना की जाती है)।

इसलिए, वर्तमान लोकेल के अनुसार, भाषा-विशिष्ट नियमों को ध्यान में रखते हुए ( cmp_to_keyफंक्शंस से सहायक समारोह है):

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
अच्छी बात। मैं अपने वर्तमान उदाहरण को छोड़ देता हूं, क्योंकि यह शायद शुरुआत के लिए आसान है कि यह क्या हो रहा है, लेकिन मैं भविष्य में इसे ध्यान में रखूंगा।
एली कोर्टराइट

1
अगर किसी को जिज्ञासा है, तो list.sort () का प्रदर्शन यहां
हरि गणेशन

1
@BornToCode: 1- मुझे पता है । संशोधन (2008) पर मेरी टिप्पणी का जवाब दें (मेरी टिप्पणी लैंबडा के अनावश्यक उपयोग के बारे में है)। 2- गैर-एएससीआईआई अक्षरों को छांटना एक बड़ा अलग विषय है। लोकल आधारित समाधान के बजाय 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

कृपया पायथन 3 में क्रमबद्ध () फ़ंक्शन का उपयोग करें

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

10

लेकिन यह भाषा विशिष्ट सॉर्टिंग नियमों को कैसे संभालती है? क्या यह लोकेल को ध्यान में रखता है?

नहीं, list.sort()एक सामान्य सॉर्टिंग फ़ंक्शन है। यदि आप यूनिकोड नियमों के अनुसार क्रमबद्ध करना चाहते हैं, तो आपको एक कस्टम प्रकार कुंजी फ़ंक्शन को परिभाषित करना होगा। आप पाइका मॉड्यूल का उपयोग करने की कोशिश कर सकते हैं , लेकिन मुझे नहीं पता कि यह कितना पूरा है।


1

पुराना सवाल है, लेकिन अगर आप बिना किसी सेटिंग के लोकल- अवेयर सॉर्टिंग करना चाहते हैं तो आप इस उत्तर के अनुसार पाइकयू लाइब्रेरीlocale.LC_ALL का उपयोग करके ऐसा कर सकते हैं :

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
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

परिणाम

['एबीसी', 'बा', 'सीडी', 'डीसी', 'xy']


0

यह सरल है: 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'

अंक = छांटे गए x के लिए स्कोर (',') (स्कोर): प्रिंट (x)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.