পাইথন 3 এ কাস্টম তুলনা ফাংশনটি কীভাবে ব্যবহার করবেন?


105

ইন পাইথন 2.x , আমি সাজানো এবং .sort ফাংশন কাস্টম ফাংশন পাস পারে

>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>> 
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']

কারণ, আমার ভাষায়, উপাদানগুলি এই আদেশের সাথে আসে

"k","kh",....,"ht",..."h",...,"a"

তবে পাইথন ৩.x এ দেখে মনে হচ্ছে যে আমি cmpকীওয়ার্ডটি পাস করতে পারিনি

>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function

কোনও বিকল্প আছে বা আমার নিজের সাজানো ফাংশনটিও লিখতে হবে?

দ্রষ্টব্য: আমি "কে", "কেএইচ" ইত্যাদি ব্যবহার করে সরলীকরণ করেছি characters প্রকৃত অক্ষরগুলি ইউনিকোড এবং আরও জটিল, কখনও কখনও স্বরচিহ্নগুলি উপস্থিত এবং এর আগেও আসে, আমি কাস্টম তুলনা ফাংশনটি করেছি, সুতরাং সেই অংশটি ঠিক আছে। কেবলমাত্র সমস্যাটি হ'ল আমি আমার কাস্টম তুলনা ফাংশনটি বাছাই বা সাজাতে পারিনি


তুমি কি ঠিক চেষ্টা করেছ sorted(x)?
সাইলেন্টগোস্ট

@ সাইলেন্টগোস্ট, এটি নিশ্চিত করার জন্য, আমি আবার চেষ্টা করেছি, অবশ্যই কাজ করছি না, কারণ বাছাই করার জন্য অপারেশন সিস্টেমগুলি দ্বারা আমার স্থানীয় ভাষা স্থানীয় তালিকার সহায়তায় নেই।
আপনি

4
আপনি একটি মূল ফাংশন হিসাবে আপনার সিএমপি মোড়ানো করতে পারেন। Cmp_to_key এর জন্য HowToSorting সাইটটি অনুসন্ধান করুন।
ফ্রাঙ্ক

এখানে কিছু অনুরূপ stackoverflow.com/questions/49327344/...
Eziz Durdyyev

উত্তর:


53

keyযুক্তিটি ব্যবহার করুন (এবং কীভাবে আপনার পুরানো ফাংশনটিকে কোনও ফাংশনে রূপান্তর করতে হবে তার রেসিপিটি অনুসরণ করুন )।cmpkey

functoolsdocs.python.org/3.6/library/functools.html#functools.cmp_to_keycmp_to_key এ উল্লিখিত একটি ফাংশন রয়েছে


+1 দেখে মনে হচ্ছে, রেসিপিটি আমাকে একগুঁয়েমুখে দেয় তবে আমি মনে করি যে সমস্ত তুলনামূলক অপারেটরকে < > = মধ্যবিত্তের কাছে দিয়ে আমি কিছু কার্যকারিতা হারাতে যাচ্ছি , যেহেতু আমার মূল কাস্টমটি সিটিতে লেখা হয়েছে, এর গতি প্রায় 1 / 2x ছিল ডিফল্ট বাছাই
আপনি

4
(কেবলমাত্র আপনার প্রোফাইলটির দিকে তাকিয়ে দেখুন) আপনার সংস্থা গুগল এবং স্ট্যাকওভারফ্লোতে অ্যাক্সেস আটকাচ্ছে? তারা কত বোকা পেতে পারে? তবে আপনার প্রতিক্রিয়া সম্পর্কে: আমি আসল পারফরম্যান্স হ্রাস সম্পর্কে আগ্রহী। আপনি timeitএটা করতে পারেন?
টিম পিটজ্যাকার

4
আমি কিছু মানদণ্ড সম্পন্ন করেছি, কাস্টম সি তুলনা ফাংশনটি সরাসরি পাসের চেয়ে প্রায় 4x ধীরের মতো দেখায়।
আপনি

4
আমার কী ফাংশন এবং একটি সিএমপি ফাংশন উভয়ই দরকার হলে? আমি প্রতিটি অভিধানে একটি কাস্টম কী দ্বারা অভিধানের তালিকা সাজিয়ে রাখতে চাই। sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)TypeError দেয়: 'CMP' এই ফাংশন জন্য একটি অবৈধ শব্দ যুক্তি, পাইথন 3.2 মধ্যে :(
অ্যালেক্স Bitek

4
স্ট্যান্ডার্ড লাইব্রেরিতে ফান্টুলগুলির একটি সিএমপি_ট_কি ফাংশন রয়েছে: docs.python.org/3.6/library/functools.html
মার্টন ফিক্সম্যান


18

কাস্টমসোর্ট () এর পরিবর্তে আপনার একটি ফাংশন প্রয়োজন যা প্রতিটি শব্দকে এমন কিছুতে অনুবাদ করে যা পাইথন ইতিমধ্যে কীভাবে বাছাই করতে পারে তা জানে। উদাহরণস্বরূপ, আপনি প্রতিটি শব্দকে সংখ্যার তালিকায় অনুবাদ করতে পারেন যেখানে প্রতিটি বর্ণ যেখানে বর্ণগুলি বর্ণিত হয় সেখানে প্রতিনিধিত্ব করে। এটার মতো কিছু:

my_alphabet = ['a', 'b', 'c']

def custom_key(word):
   numbers = []
   for letter in word:
      numbers.append(my_alphabet.index(letter))
   return numbers

x=['cbaba', 'ababa', 'bbaa']
x.sort(key=custom_key)

যেহেতু আপনার ভাষায় বহু-অক্ষরযুক্ত অক্ষর রয়েছে, তাই আপনার কাস্টম_কি ফাংশনটি আরও জটিল হওয়া উচিত। এটি আপনাকে যদিও সাধারণ ধারণা দেবে।


ধন্যবাদ +1, আমার মনে হয় যেভাবে আইসিইউ। তবে যেহেতু আমার ভাষার শব্দের পৃথককারী নেই এবং মানকীয় রোমানাইজ বিধি নেই, তাই আমার মনে হয় গবেষণায় সময় লাগবে।
আপনি

10

একটি সম্পূর্ণ পাইথন 3 সিএমপি_ টো_কি ল্যাম্বদা উদাহরণ:

from functools import cmp_to_key

nums = [28, 50, 17, 12, 121]
nums.sort(key=cmp_to_key(lambda x, y: 1 if str(x)+str(y) < str(y)+str(x) else -1))

সাধারণ বস্তু বাছাইয়ের সাথে তুলনা করুন:

class NumStr:
    def __init__(self, v):
        self.v = v
    def __lt__(self, other):
        return self.v + other.v < other.v + self.v


A = [NumStr("12"), NumStr("121")]
A.sort()
print(A[0].v, A[1].v)

A = [obj.v for obj in A]
print(A)

4

আমি জানি না এটি সাহায্য করবে কিনা তবে আপনি localeমডিউলটি পরীক্ষা করতে পারেন । দেখে মনে হচ্ছে আপনি আপনার ভাষাতে লোকেল সেট করতে পারেন এবং locale.strcollআপনার ভাষার বাছাইয়ের নিয়ম ব্যবহার করে স্ট্রিংগুলির তুলনা করতে ব্যবহার করতে পারেন ।


জনপ্রিয় ভাষাগুলির ক্ষেত্রে এটি সত্য তবে আমার ভাষা অপারেশন সিস্টেমস, আইসিইউ এবং ইউনিকোড.অর্গ.এর দ্বারা সম্পূর্ণরূপে সমর্থিত নয়, সুতরাং প্রশ্নটি বাদ দেয় না, তবে ভাল পরামর্শের জন্য +1।
আপনি

-2

ব্যবহার করুন keyপরিবর্তে যুক্তি। এটি এমন একটি ফাংশন নেয় যা প্রক্রিয়াজাতকরণের মানটি গ্রহণ করে এবং একটি একক মান প্রদান করে যা অনুসারে বাছাই করার জন্য কী প্রদান করে।

sorted(x, key=somekeyfunc)

4
কী কেবল একটি প্যারামিটার ফাংশন গ্রহণ করে, সিএমপিতে 2 টি প্যারামিটার থাকে, সেগুলি ভিন্ন আচরণ। এবং আমি কেবল পরীক্ষিত হয়েছি, ত্রুটি পেয়েছি, মূল কীওয়ার্ডের কারণে কেবলমাত্র একটি প্যারামিটার পাস হয়েছে,TypeError: customsort() takes exactly 2 positional arguments (1 given)
আপনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.