স্ট্রিংগুলির তালিকা বাছাই কিভাবে?


417

পাইথনে বর্ণানুক্রমিকভাবে সাজানো তালিকা তৈরির সর্বোত্তম উপায় কী?


1
localeবর্তমান লোকেল অনুসারে প্রাকৃতিকভাবে সাজানোর জন্য এটির স্ট্রিং কোলেশন পদ্ধতিগুলি ব্যবহার করুন এবং করুন ।
u0b34a0f6ae

উত্তর:


519

প্রাথমিক উত্তর:

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

এটি আপনার আসল তালিকাকে (যেমন স্থানের ধরণে সাজিয়ে তোলে) পরিবর্তন করে। আসলটি পরিবর্তন না করে তালিকার সাজানো অনুলিপি পেতে sorted()ফাংশনটি ব্যবহার করুন :

for x in sorted(mylist):
    print x

তবে উপরের উদাহরণগুলি কিছুটা নির্বোধ, কারণ তারা লোকালকে বিবেচনায় নেয় না এবং কেস-সংবেদনশীল বাছাই করে। আপনি keyপছন্দসই বাছাইয়ের আদেশ নির্দিষ্ট করতে al চ্ছিক প্যারামিটারের সুবিধা নিতে পারেন (বিকল্পটি ব্যবহার করে 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
যদি কেউ আগ্রহী হন তবে তালিকাটির সম্পাদনা () এখানে
হরি গণেশান

1
@ বার্নটোকোড: ১- আমি জানি । পুনর্বিবেচনাটি দেখুন (২০০৮) আমার মন্তব্যের জবাবগুলি (আমার মন্তব্য লাম্বদার অপ্রয়োজনীয় ব্যবহার সম্পর্কে)। 2- অ-এসসিআইআই অক্ষর বাছাই করা একটি বড় পৃথক বিষয়। লোকাল-ভিত্তিক সমাধানের পরিবর্তে পাইআইসিইউ ব্যবহার করা যেতে পারে
jfs

1
@ দিমিত্রি এটি কারণ যে আপনি সাজানো ফাংশনের রিটার্ন মান মুদ্রণ করছেন [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- র প্রসঙ্গের জন্য কাজ করবে।



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))

স্ট্রিং তুমি এখানে বাছাই করা হয় একটি তালিকা নয় যে
mnl


0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

ফলাফল

['এবিসি', 'বা', 'সিডি', 'ডিসি', 'এক্সআই']


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 এর জন্য স্কোর = স্কোর.স্প্লিট (','): মুদ্রণ (এক্স)

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