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





15 Answers

হিসাবে সহজ হিসাবে: 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 এ ধরনের সমস্যা সমাধানের চেষ্টা করছে। এবং সমাধানটি উপরে দেখানো মানগুলির উপর ভিত্তি করে কীগুলির তালিকা সাজানোর জন্য।

python sorting dictionary

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

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

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




Dicts বাছাই করা যাবে না, কিন্তু আপনি তাদের থেকে একটি সাজানো তালিকা তৈরি করতে পারেন।

স্বর মূল্যের একটি সাজানো তালিকা:

sorted(d.values())

মান অনুসারে সাজানো (কী, মান) জোড়াগুলির একটি তালিকা:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))



আপডেট: পাইথন 3.5 ব্যবহার করে 5 ডিসেম্বর ২015

যখন আমি গৃহীত উত্তরটিকে দরকারী বলে মনে করি, তখন আমি অবাক হয়ে গেলাম যে এটি কার্যকর লাইব্রেরী সংগ্রহের মডিউল থেকে OrderedDict একটি কার্যকর, আধুনিক বিকল্প - ঠিক এই সমস্যাটির সমাধান করার জন্য ডিজাইন করা হিসাবে উল্লেখ করার জন্য আপডেট করা হয়নি।

from operator import itemgetter
from collections import OrderedDict

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = OrderedDict(sorted(x.items(), key=itemgetter(1)))
# OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

অফিসিয়াল OrderedDict ডকুমেন্টেশন খুব অনুরূপ উদাহরণ দেয়, তবে সাজানোর ফাংশনের জন্য ল্যাম্বা ব্যবহার করে:

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

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



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


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

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


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




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

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



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

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]



নিম্নলিখিত পদ্ধতির চেষ্টা করুন। আসুন ডেডিকেটেড নামক ডেডিকেটেড নামটি ডেডিকেটেড করে দিই:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

যদি কেউ কী দ্বারা অভিধানটি সাজানোর চেষ্টা করতে চায়, তবে কেউ এমন কিছু করতে পারে:

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

এই নিম্নলিখিত আউটপুট ফিরে করা উচিত:

alan: 2
bob: 1
carl: 40
danny: 3

অন্য দিকে, যদি কেউ অভিধান দ্বারা কোনও অভিধানকে সাজানোর চেষ্টা করতে চায় (যেমন প্রশ্নে জিজ্ঞাসা করা হয়), তখন কেউ তা করতে পারে:

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

এই কমান্ডের ফলাফল (মান অনুসারে অভিধান সাজানোর) নিম্নলিখিতটি ফেরত দিতে হবে:

bob: 1
alan: 2
danny: 3
carl: 40



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

>>> 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 ব্যবহার করে প্রয়োগ করা হয়।




আপনি কী পাস হতে পারে যে কাস্টম ফাংশন ব্যবহার করতে পারেন।

def dict_val(x):
    return x[1]
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=dict_val)

অন্য একটি উপায় labmda ফাংশন ব্যবহার করা হয়

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



ডিক্ট থেকে 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)]



আমি এই এক সঙ্গে এসেছিলেন,

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

পাইথন 3.x এর জন্য: x.items() iteritems() প্রতিস্থাপন iteritems()

>>> sorted_x
{0: 0, 1: 2, 2: 1, 3: 4, 4: 3}

অথবা collections.OrderedDict সঙ্গে চেষ্টা করুন। collections.OrderedDict !

x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
from collections import OrderedDict

od1 = OrderedDict(sorted(x.items(), key=lambda t: t[1]))



অবশ্যই, মনে রাখবেন, আপনাকে 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 বা উপরে ব্যবহার না করে প্রিন্টের পরে বন্ধনীটি সরাতে মনে রাখবেন




যদি আপনার মান পূর্ণসংখ্যা থাকে এবং আপনি পাইথন 2.7 বা নতুন ব্যবহার করেন তবে আপনি dict ব্যবহার করার পরিবর্তে dict ব্যবহার করতে পারেন। সবচেয়ে most_common পদ্ধতি মান দ্বারা সাজানো, আপনি সব আইটেম দিতে হবে।






Related