python - আমি মান দ্বারা একটি অভিধান সাজান কিভাবে?




sorting dictionary (20)

আমার ডাটাবেসের দুটি ক্ষেত্র থেকে পড়া মানের একটি অভিধান আছে: একটি স্ট্রিং ক্ষেত্র এবং একটি সংখ্যাসূচক ক্ষেত্র। স্ট্রিং ক্ষেত্রটি অনন্য, তাই অভিধান অভিধান।

আমি কীগুলোকে সাজিয়ে রাখতে পারি, কিন্তু আমি মানগুলির উপর ভিত্তি করে সাজানোর কীভাবে করতে পারি?

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


পাইথন 3.6 হিসাবে নির্মিত অন্তর্নির্মিত আদেশ করা হবে

ভাল খবর, তাই বিল্ট-ইন পাইথন v3.6+ dict মধ্যে মান হিসাবে কী এবং সংখ্যাসূচক মান হিসাবে অনন্য স্ট্রিং ids সহ একটি ডাটাবেস থেকে OP এর আসল ব্যবহার ক্ষেত্রে পুনরুদ্ধার করা হয়েছে, এখন সন্নিবেশ ক্রমকে সম্মান করতে হবে।

যদি ডাটাবেস কোয়েরি থেকে দুটি কলাম টেবিল এক্সপ্রেশন যেমন বলে থাকে:

SELECT a_key, a_value FROM a_table ORDER BY a_value;

দুটি পাইথন টুপলে, k_seq এবং v_seq (সংখ্যাসূচক সূচী দ্বারা সংহত এবং অবশ্যই একই দৈর্ঘ্যের সাথে) সংরক্ষণ করা হবে, তারপরে:

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

পরে আউটপুট করার অনুমতি দিন:

for k, v in ordered_map.items():
    print(k, v)

এই ক্ষেত্রে উত্পাদিত (নতুন পাইথন 3.6+ অন্তর্নির্মিত লেখার জন্য!):

foo 0
bar 1
baz 42

প্রতি মান একই ক্রম।

পাইথন 3.5 এ যেখানে আমার মেশিনে ইন্সটল করা হয় সেখানে এটি বর্তমানে উত্পাদিত হয়:

bar 1
foo 0
baz 42

বিবরণ:

২01২ সালে রেমন্ড হিটিংয়ের (পিওথন-ডেভিড বিষয়ক পিওথন-ডেভ উপর " পিপথ-ডেভ " বিষয়ক সিএফ মেইল "আরও দ্রুত পুনরাবৃত্তি সহ আরো কমপ্যাক্ট অভিধানসমূহ " ) প্রস্তাবিত এবং এখন (২016 সালে) ভিক্টর স্টিনারের একটি চিঠিতে পাইথন-ডেভের সাথে একটি চিঠিতে ঘোষণা করেছে "পাইথন 3.6 টিউট হয়ে যায় কম্প্যাক্ট এবং একটি ব্যক্তিগত সংস্করণ পায় এবং কীওয়ার্ডগুলি " 27350 ইস্যুর ফিক্স / বাস্তবায়নের কারণে " পাইথন 3.6 তে কম্প্যাক্ট এবং অর্ডারকৃত নির্দেশ "এর আদেশ দেওয়া হয় , যাতে আমরা এখন সন্নিবেশ আদেশ বজায় রাখতে অন্তর্নির্মিত নির্দেশ ব্যবহার করতে সক্ষম হব !!

আশা করি এটি একটি পাতলা লেয়ার OrderedDict বাস্তবায়ন প্রথম ধাপ হিসাবে নেতৃত্ব হবে। যেমন @ জিমফাসারাকিস-হিলিয়ার্ড নির্দেশ করেছেন, কিছু ভবিষ্যতে অর্ডার্ডড্টিক প্রকারের ক্ষেত্রেও মামলাগুলি ব্যবহার করে। আমি মনে করি পাইথন সম্প্রদায়টি বড়ভাবে যত্নসহকারে পরিদর্শন করবে, যদি এটি সময়ের পরীক্ষায় দাঁড়াবে এবং পরবর্তী পদক্ষেপগুলি কী হবে।

স্থিতিশীল ক্রম দ্বারা খোলা সম্ভাবনার মিস্ না করার জন্য আমাদের কোডিং অভ্যাস পুনরায় চিন্তা করার সময়:

  • কীওয়ার্ড আর্গুমেন্ট এবং
  • (অন্তর্বর্তী) dict স্টোরেজ

প্রথম কারণ এটি কিছু ক্ষেত্রে ফাংশন এবং পদ্ধতি বাস্তবায়নে প্রেরণ সহজ।

দ্বিতীয় এটি আরও সহজে প্রক্রিয়াকরণ পাইপলাইন প্রক্রিয়াকরণ মধ্যবর্তী স্টোরেজ হিসাবে dict ব্যবহার করার জন্য উত্সাহিত।

রেমন্ড হেইটিংার তার সান ফ্রান্সিসকো পাইথন মিটআপ গ্রুপ উপস্থাপনা ২016-ডিইসি -8২ থেকে " দ্য টেক পাইথন 3.6 অভিধানসমূহের পিছনে " - ব্যাখ্যা করে ডকুমেন্টেশন সরবরাহ করেছেন।

এবং সম্ভবত বেশ কিছু স্ট্যাক ওভারফ্লো উচ্চ সজ্জিত প্রশ্ন এবং উত্তর পৃষ্ঠাগুলি এই তথ্যগুলির বৈচিত্র পাবে এবং অনেক উচ্চমানের উত্তরগুলির প্রতি সংস্করণ আপডেটও প্রয়োজন হবে।

ক্যাভিট ইমপ্টার (কিন্তু 2017-12-15 আপডেটের নিচে দেখুন):

@ ইয়াস্কার ঠিকমত নোট করেছেন: "এই নতুন বাস্তবায়নের আদেশ-সংরক্ষণের দিকটি বাস্তবায়ন হিসাবে বিবেচিত হয় এবং এতে নির্ভর করা উচিত নয়।" ( whatsew36 থেকে) নাইট picking না, কিন্তু উদ্ধৃতি একটি বিট নিস্তেজ কাটা ছিল ;-)। এটি চলতে থাকে "(এটি ভবিষ্যতে পরিবর্তিত হতে পারে, তবে বর্তমান এবং ভবিষ্যতের পাইথন বাস্তবায়নের জন্য শব্দ-রক্ষার সীমাবদ্ধতা জারি করার আগে ভাষা সংশোধন পরিবর্তনের জন্য কয়েকটি রিলিজের জন্য ভাষাতে এই নতুন লেখার বাস্তবায়ন করার ইচ্ছা রয়েছে; এটিও ভাষার পুরানো সংস্করণগুলির সাথে পিছনের দিকের সামঞ্জস্য রক্ষা করতে সহায়তা করে যেখানে র্যান্ডম পুনরাবৃত্তি ক্রম এখনও কার্যকর, যেমন পাইথন 3.5)। "

তাই কিছু মানুষের ভাষা যেমন জার্মান ভাষা ব্যবহার করে, ভাষাটি আকার করে এবং এখন উইল ঘোষণা করা হয়েছে ... whatsew36 তে

2017-12-15 আপডেট করুন:

পাইথন-ডেভি তালিকার একটি মেইলে , গুইডো ভ্যান রসাম ঘোষণা করেছেন:

তবে এটাই করো. "দোষী সন্নিবেশ আদেশ রাখে" শাসন। ধন্যবাদ!

সুতরাং, সংস্করণ 3.6 CPTthon সরল সন্নিবেশ ক্রম এর পার্শ্ব প্রতিক্রিয়া এখন ভাষা spec (এবং এখন শুধুমাত্র একটি বাস্তবায়ন বিস্তারিত নয়) অংশ হয়ে উঠছে। যে মেইল ​​থ্রেড এছাড়াও collections.OrderedDict জন্য কিছু ডিজিটাল নকশা লক্ষ্য surfaced। OrrdDict হিসাবে আলোচনা সময় Raymond Hettinger দ্বারা স্মরণ করিয়ে।


হিসাবে সহজ হিসাবে: sorted(dict1, key=dict1.get)

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

যদি আপনি অভিধানগুলির সাহায্যে একটি অভিধান গঠন করেন এবং প্রতিটি শব্দের মান হিসাবে মান হিসাবে সংখ্যা, এখানে সরলীকৃত:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

তারপরে আপনি শব্দগুলির একটি তালিকা পেতে পারেন, sorted(d, key=d.get) সহ ব্যবহারের ফ্রিকোয়েন্সি sorted(d, key=d.get) আদেশ দেওয়া হয় - সাজানোর কী হিসাবে শব্দ ঘটনার সংখ্যা ব্যবহার করে সাজানো অভিধান কীগুলির উপর পুনরাবৃত্তি করে।

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

আমি এই বিস্তারিত ব্যাখ্যাটি লেখার জন্য লিখছি যে লোকেরা কি বোঝাতে চেয়েছেন যে "কীভাবে আমি সহজেই একটি অভিধানকে সাজিয়ে তুলতে পারি, কিন্তু কীভাবে আমি মান অনুসারে সাজিয়ে থাকি" - এবং আমার মনে হয় OP এ ধরনের সমস্যা সমাধানের চেষ্টা করছে। এবং সমাধানটি উপরে দেখানো মানগুলির উপর ভিত্তি করে কীগুলির তালিকা সাজানোর জন্য।


অবশ্যই, মনে রাখবেন, আপনাকে OrderedDict ব্যবহার করতে হবে কারণ নিয়মিত পাইথন অভিধান মূল OrderedDict রাখে না।

from collections import OrderedDict
a = OrderedDict(sorted(originalDict.items(), key = lambda x: x[1]))

যদি আপনার পাইথন 2.7 বা উচ্চতর না থাকে, তবে আপনি যা করতে পারেন তা হল জেনারেটরের ফাংশনে মানগুলির উপর পুনরাবৃত্তি করা। (এখানে 2.4 এবং 2.6 এর জন্য একটি আদেশযুক্ত ডিক্টটি রয়েছে তবে

a) I don't know about how well it works 

এবং

b) You have to download and install it of course. If you do not have administrative access, then I'm afraid the option's out.)
def gen(originalDict):
    for x,y in sorted(zip(originalDict.keys(), originalDict.values()), key = lambda z: z[1]):
        yield (x, y)
    #Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want. 

for bleh, meh in gen(myDict):
    if bleh == "foo":
        print(myDict[bleh])

আপনি প্রতি মান প্রিন্ট আউট করতে পারেন

for bleh, meh in gen(myDict):
    print(bleh,meh)

পাইথন 3.0 বা উপরে ব্যবহার না করে প্রিন্টের পরে বন্ধনীটি সরাতে মনে রাখবেন


অভিধানটি বাছাই করা সম্ভব নয়, কেবল সাজানো অভিধানটির প্রতিনিধিত্ব পেতে। অভিধানগুলি স্বাভাবিকভাবেই অকার্যকর, তবে অন্যান্য ধরনের যেমন তালিকা এবং টিপলগুলি নয়। সুতরাং আপনি সাজানো মান প্রতিনিধিত্ব করার জন্য একটি অর্ডারকৃত ডাটা টাইপের প্রয়োজন, যা একটি তালিকা হতে পারে-সম্ভবত tuples এর একটি তালিকা।

এই ক্ষেত্রে,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x প্রতিটি tuple মধ্যে দ্বিতীয় উপাদান দ্বারা সাজানো tuples একটি তালিকা হতে হবে। dict(sorted_x) == x

এবং যারা মান পরিবর্তে চাবি বাছাই করতে ইচ্ছুক:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

Python3 ইন unpacking অনুমতি দেওয়া হয় না [1] আমরা ব্যবহার করতে পারেন

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_by_value = sorted(x.items(), key=lambda kv: kv[1])

আপনি একটি "বিপরীত সূচক" তৈরি করতে পারেন, এছাড়াও

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

এখন আপনার বিপরীত মান আছে; প্রতিটি মান প্রযোজ্য কী একটি তালিকা আছে।

for k in sorted(inverse):
    print k, inverse[k]

আপনি একটি স্কিপ ড্র ব্যবহার করতে পারেন যা একটি অভিধান যা স্থায়ীভাবে মান অনুসারে সাজানো হয়।

>>> data = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> SkipDict(data)
{0: 0.0, 2: 1.0, 1: 2.0, 4: 3.0, 3: 4.0}

যদি আপনি keys() , values() বা items() তবে আপনি মান অনুসারে সাজানো ক্রম পুনরাবৃত্তি করবেন।

এটি skip তালিকা datastructure ব্যবহার করে প্রয়োগ করা হয়।


আপনি পাইথন এর সাজানো ফাংশন ব্যবহার করতে পারেন

sorted(iterable[, cmp[, key[, reverse]]])

সুতরাং আপনি ব্যবহার করতে পারেন:

sorted(dictionary.items(),key = lambda x :x[1])

সাজানো ফাংশন সম্পর্কে আরও তথ্যের জন্য এই লিঙ্কটিতে যান: https://docs.python.org/2/library/functions.html#sorted


আপনি ব্যবহার করতে পারেন:

sorted(d.items(), key=lambda x: x[1])

এটি অভিধানে প্রতিটি প্রকারের মানগুলি দ্বারা অভিধানকে ছোট থেকে বৃহত্তম পর্যন্ত সাজানোর জন্য।


আমি একই সমস্যা ছিল, এবং আমি এটি এই মত সমাধান:

WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

(যারা উত্তর দেয় "কোনও রচনা সাজানো সম্ভব নয়" প্রশ্নটি পড়েননি! আসলে, "আমি কীগুলিকে সাজিয়ে রাখতে পারি, কিন্তু আমি মানগুলির উপর ভিত্তি করে সাজানোর কীভাবে সমাধান করতে পারি?" স্পষ্টতই এর মানে হল যে তিনি একটি তালিকা চান কীগুলি তাদের মানগুলির মান অনুসারে সাজানো।)

অনুগ্রহ করে লক্ষ্য করুন যে অর্ডারটি ভাল সংজ্ঞায়িত নয় (একই মান সহ কীগুলি আউটপুট তালিকায় একটি নির্বিচারে আদেশে থাকবে)।


এই কোডটি হল:

import operator
origin_list = [
    {"name": "foo", "rank": 0, "rofl": 20000},
    {"name": "Silly", "rank": 15, "rofl": 1000},
    {"name": "Baa", "rank": 300, "rofl": 20},
    {"name": "Zoo", "rank": 10, "rofl": 200},
    {"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
for foo in origin_list:
    print foo

print "\n>> Rofl sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rofl")):
    print foo

print "\n>> Rank sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rank")):
    print foo

এখানে ফলাফল:

মূল

{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}

rofl

{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}

মর্যাদাক্রম

{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}

এখানে d.values() এবং d.keys() জিপ ব্যবহার করে একটি সমাধান। এই লিঙ্কে কয়েকটি লাইন (অভিধান দেখুন বস্তুগুলিতে) হল:

এটি zip (): pair = zip (d.values ​​(), d.keys ()) ব্যবহার করে (মান, কী) জোড়া তৈরি করার অনুমতি দেয়।

সুতরাং আমরা নিম্নলিখিত কাজ করতে পারেন:

d = {'key1': 874.7, 'key2': 5, 'key3': 8.1}

d_sorted = sorted(zip(d.values(), d.keys()))

print d_sorted 
# prints: [(5, 'key2'), (8.1, 'key3'), (874.7, 'key1')]

এটি অভিধান থেকে কী-মান জোড়াগুলির তালিকা প্রদান করে, যা সর্বোচ্চ থেকে সর্বনিম্ন মান অনুসারে সাজানো হয়:

sorted(d.items(), key=lambda x: x[1], reverse=True)

কী দ্বারা সাজানো অভিধান জন্য, নিম্নলিখিত ব্যবহার করুন:

sorted(d.items(), reverse=True)

ফেরত tuples একটি তালিকা কারণ অভিধান নিজেদের সাজানো যাবে না।

এই উভয় মুদ্রিত বা আরও গণনা মধ্যে পাঠানো হতে পারে।


টেকনিক্যালি, অভিধান ক্রম হয় না, এবং তাই সাজানো যাবে না। আপনি ভালো কিছু করতে পারেন

sorted(a_dictionary.values())

অভিমানী কর্মক্ষমতা একটি বিশাল চুক্তি নয়।


দেওয়া অভিধান

e = {1:39, 4:34, 7:110, 2:87}

শ্রেণীবিভাজন

sred = sorted(e.items(), key=lambda value: value[1])

ফল

[(4, 34), (1, 39), (2, 87), (7, 110)]

জিনিসগুলি মান অনুসারে সাজানোর জন্য আপনি একটি ল্যাম্বা ফাংশন ব্যবহার করতে পারেন এবং একটি পরিবর্তনশীলের ভিতরে প্রসেস করতে পারেন, এই ক্ষেত্রে এটি মূল অভিধানের সাথে প্রযোজ্য

আশা করি এইটি কাজ করবে!


পাইথন 2.7 এ, কেবল করবেন:

from collections import OrderedDict
# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

কপি-পেস্ট থেকে: http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

উপভোগ করুন ;-)


মান সংখ্যার যদি আপনি সংগ্রহ থেকে কাউন্টার ব্যবহার করতে পারেন

from collections import Counter

x={'hello':1,'python':5, 'world':3}
c=Counter(x)
print c.most_common()


>> [('python', 5), ('world', 3), ('hello', 1)]    

সাম্প্রতিক পাইথন 2.7 এ, আমাদের নতুন OrderedDict টাইপ রয়েছে, যা আইটেমটি যোগ করা হয়েছে তা মনে করে।

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

মূলগুলির থেকে সাজানো, মূল থেকে একটি নতুন আদেশ দেওয়া অভিধান তৈরি করতে:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

আর্ক্ডডিক্ট একটি স্বাভাবিক স্বর মত আচরণ করে:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

হ্যাঙ্ক গে এর উত্তরের মতোই বেশিরভাগই একই;

    sorted([(value,key) for (key,value) in mydict.items()])

অথবা জন Fouhy দ্বারা প্রস্তাবিত হিসাবে একটি বিট অপ্টিমাইজ করা;

    sorted((value,key) for (key,value) in mydict.items())


ডিক্ট থেকে ValueSortedDict ব্যবহার করুন:

from dicts.sorteddict import ValueSortedDict
d = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_dict = ValueSortedDict(d)
print sorted_dict.items() 

[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

ডিলিট্যান্টের নির্দেশ অনুসারে পাইথন 3.6 এখন অর্ডার রাখবে ! আমি ভেবেছিলাম আমি একটি ফাংশন শেয়ার করব যা লিখেছে যে এটি একটি পুনরাবৃত্তিযোগ্য (tuple, তালিকা, dict) সাজানোর সহজ করে। পরবর্তী ক্ষেত্রে, আপনি কি কোনও কী বা মানগুলিতে বাছাই করতে পারেন এবং এটি অ্যাকাউন্টে সংখ্যাসূচক তুলনা করতে পারে। শুধু> = 3.6 জন্য!

যখন আপনি একটি ইয়ারেবলের সাজানো ব্যবহার করার চেষ্টা করেন যেমন স্ট্রিংগুলি এবং ইটগুলি থাকে, সাজানো () ব্যর্থ হবে। অবশ্যই আপনি str () সঙ্গে স্ট্রিং তুলনা করতে বাধ্য করতে পারেন। যাইহোক, কিছু ক্ষেত্রে আপনি প্রকৃত সংখ্যাসূচক তুলনা করতে চান যেখানে 12 20 চেয়ে ছোট (যা স্ট্রিং তুলনা ক্ষেত্রে নয়)। তাই আমি নিম্নলিখিত সঙ্গে এসেছেন। যখন আপনি সুস্পষ্ট সংখ্যাসূচক তুলনা করতে চান তখন আপনি পতাকাটি num_as_num ব্যবহার করতে পারেন যা সমস্ত মানকে ফ্লোটগুলিতে রূপান্তর করার চেষ্টা করে স্পষ্ট সংখ্যাসূচক শ্রেণীকরণ করার চেষ্টা করবে। যদি এটি সফল হয়, এটি সংখ্যাসূচক বাছাই করবে, অন্যথায় এটি স্ট্রিং তুলনা অবলম্বন করবে।

উন্নতি বা ধাক্কা অনুরোধের জন্য মন্তব্য স্বাগত জানাই।

def sort_iterable(iterable, sort_on=None, reverse=False, num_as_num=False):
    def _sort(i):
      # sort by 0 = keys, 1 values, None for lists and tuples
      try:
        if num_as_num:
          if i is None:
            _sorted = sorted(iterable, key=lambda v: float(v), reverse=reverse)
          else:
            _sorted = dict(sorted(iterable.items(), key=lambda v: float(v[i]), reverse=reverse))
        else:
          raise TypeError
      except (TypeError, ValueError):
        if i is None:
          _sorted = sorted(iterable, key=lambda v: str(v), reverse=reverse)
        else:
          _sorted = dict(sorted(iterable.items(), key=lambda v: str(v[i]), reverse=reverse))

      return _sorted

    if isinstance(iterable, list):
      sorted_list = _sort(None)
      return sorted_list
    elif isinstance(iterable, tuple):
      sorted_list = tuple(_sort(None))
      return sorted_list
    elif isinstance(iterable, dict):
      if sort_on == 'keys':
        sorted_dict = _sort(0)
        return sorted_dict
      elif sort_on == 'values':
        sorted_dict = _sort(1)
        return sorted_dict
      elif sort_on is not None:
        raise ValueError(f"Unexpected value {sort_on} for sort_on. When sorting a dict, use key or values")
    else:
      raise TypeError(f"Unexpected type {type(iterable)} for iterable. Expected a list, tuple, or dict")




dictionary