স্ট্রিংয়ের দৈর্ঘ্যের উপর ভিত্তি করে পাইথন তালিকা বাছাই করা হচ্ছে


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(x, y)-1 এর xচেয়ে কম হলে y0 , xসমান হলে 0 yএবং এর xচেয়ে বড় হলে 1 প্রদান করে 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()": সাজানোর () কোন অবস্থানগত আর্গুমেন্ট লাগে TypeError" ছোঁড়ার। পরিবর্তে এটি হওয়া উচিতxs.sort(key=lambda x: len(x))
হাই-অ্যাঞ্জেল

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
আমি দৈর্ঘ্যের উপর বাছাই কিভাবে করব?
ব্যবহারকারী 2922935

1
@ ব্যবহারকারী 2922935: আপনি ইতিমধ্যে বাছাই করা তালিকাটি বিপরীতে করতে xs [:: - 1] করতে পারেন। ড্যান বাডারের
থায়াগ

7
xs.sort(key=len, reverse=True)
রাজ

5

আমি যুক্ত করতে চাই যে বাছাইয়ের সময় পাইথোনিক কী ফাংশনটি কীভাবে কাজ করে:

সাজসজ্জা-সাজান-আনাগোনা ডিজাইন প্যাটার্ন:

সাজসজ্জা-সাজানো-আন্ডারকোর্ট ডিজাইনের প্যাটার্ন হিসাবে পরিচিত যা ব্যবহার করে বাছাই করা হয় তখন মূল ফাংশনের জন্য পাইথনের সমর্থন।

এটি 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.