स्ट्रिंग की लंबाई के आधार पर पायथन सूची को क्रमबद्ध करना


110

मैं स्ट्रिंग की लंबाई के आधार पर तार की एक सूची को सॉर्ट करना चाहता हूं। मैंने निम्नानुसार सॉर्ट का उपयोग करने की कोशिश की, लेकिन यह मुझे सही परिणाम नहीं देता है।

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

क्या गलत हो सकता है?

जवाबों:


201

जब आप एक पास करते lambdaहैं sort, तो आपको एक पूर्णांक वापस करने की आवश्यकता होती है, बूलियन नहीं। इसलिए आपके कोड को इस प्रकार पढ़ना चाहिए:

xs.sort(lambda x,y: cmp(len(x), len(y)))

ध्यान दें कि cmp एक बिल्टइन फ़ंक्शन है, जो cmp(x, y)-1 रिटर्न देता है यदि 0 xसे कम है y, यदि 0 के xबराबर है y, और 1 यदि xइससे अधिक है y

बेशक, आप इसके बजाय keyपैरामीटर का उपयोग कर सकते हैं :

xs.sort(key=lambda s: len(s))

यह sortकुंजी फ़ंक्शन को वापस करने के आधार पर ऑर्डर करने की विधि बताता है।

संपादित करें: नीचे दिए गए संकेत के लिए बाल्फा और रुस्लान के लिए धन्यवाद कि आप lenसीधे कार्य के लिए मुख्य पैरामीटर के रूप में पास कर सकते हैं , इस प्रकार एक की आवश्यकता को समाप्त कर सकते हैं lambda:

xs.sort(key=len)

और जैसा कि रुस्लान नीचे बताते हैं, आप विधि के बजाय बिल्ट-इन सॉर्ट किए गए फ़ंक्शन का उपयोग कर सकते हैं list.sort, जो मौजूदा एक-स्थान को सॉर्ट करने के बजाय एक नई सूची बनाता है:

print(sorted(xs, key=len))

32
की कोई जरूरत नहीं lambda; बस का उपयोग करेंkey = len
बेलफा

15
यह आरोही क्रम में क्रमबद्ध होगा (शीर्ष पर शब्दों की छोटी लंबाई), अवरोही क्रम में क्रमबद्ध करने के लिए (सबसे छोटे शब्दों की लंबाई) एक पैरामीटर उल्टा
अजय गुप्ता

xs.sort()": प्रकार () कोई स्थितीय तर्क लेता लेखन त्रुटि" फेंकता है। इसके बजाय यह होना चाहिएxs.sort(key=lambda x: len(x))
Hi-Angel

84

एली के जवाब में भी ऐसा ही है - केवल एक छोटे रूप का उपयोग करने के कारण, क्योंकि आप lambdaयहां एक भाग छोड़ सकते हैं।

नई सूची बनाना:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

जगह छँटाई में:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
मैं लंबाई पर किस प्रकार रिवर्स कर सकता हूं?
user2922935

1
@ user2922935: पहले से ही सॉर्ट की गई सूची को उलटने के लिए आप x [:: - 1] कर सकते हैं। यहाँ दान बदर का लेख देखें: dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
रज़

5

मैं जोड़ना चाहूंगा कि छँटाई करते समय पाइथोनिक कुंजी फ़ंक्शन कैसे काम करता है:

सजाने-क्रमबद्ध-अछूता डिजाइन पैटर्न:

एक प्रमुख कार्य के लिए पायथन का समर्थन जब सजावट-सॉर्ट-undecorate डिजाइन पैटर्न के रूप में जाना जाता है का उपयोग करके लागू किया जाता है।

यह 3 चरणों में आगे बढ़ता है:

  1. सूची के प्रत्येक तत्व को अस्थायी रूप से "सजाए गए" संस्करण के साथ बदल दिया जाता है जिसमें तत्व पर लागू कुंजी फ़ंक्शन का परिणाम शामिल होता है।

  2. कुंजियों के प्राकृतिक क्रम के आधार पर सूची को क्रमबद्ध किया जाता है।

  3. सजाए गए तत्वों को मूल तत्वों द्वारा प्रतिस्थापित किया जाता है।

तुलना करने के लिए प्रत्येक सूची तत्व पर एक फ़ंक्शन को निर्दिष्ट करने के लिए मुख्य पैरामीटर। डॉक्स



1

लंबाई के आधार पर तार की एक सूची को सॉर्ट करने के लिए एक फ़ंक्शन लेंस लिखें।

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

यह मेरे लिए काम करता है!


0

मैं इसे फंक्शन का उपयोग करके नीचे दो तरीकों से कर सकता हूं

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

एक लाइनर में लैम्बडा का उपयोग करते हुए, नीचे के रूप में, पहले से ही ऊपर उत्तर दिया गया है।

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.