আমি কীভাবে একটি মানকে মূল্য অনুসারে বাছাই করব?


3422

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

আমি কীগুলি বাছাই করতে পারি, তবে মানগুলির উপর ভিত্তি করে আমি কীভাবে বাছাই করতে পারি?

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


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

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

: সমস্ত তিনটি আউটপুট (কি, মূল্যবোধ, উভয়) অভিধান বাছাইয়ের জন্য একটি পরিষ্কার এবং সংক্ষিপ্ত শৈলী এখানে আচ্ছাদিত করা হয় stackoverflow.com/questions/16772071/sort-dict-by-value-python
JStrahl

2
@ দাইশিমন বেস ক্লাসটি অর্ডার নাও হতে পারে তবে অর্ডারডিক্ট অবশ্যই is
টেলর এডমিস্টন

1
পাইথন 3.6+ অভিধানে সন্নিবেশ ক্রম সংরক্ষণ করে। এটি অবশ্যই মান অনুসারে বাছাই করার সম্ভাবনার মতো নয় তবে অন্যদিকে, "অভিধানের ডাটা স্ট্রাকচারের অন্তর্নিহিত ক্রম নেই" বললে আর বৈধতা পাওয়া যায় না।
কনরাড কোচিক

উত্তর:


4943

পাইথন ৩.6++

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{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 = sorted(x.items(), key=operator.itemgetter(1))

sorted_xপ্রতিটি টিপলের দ্বিতীয় উপাদান অনুসারে বাছাই করা তালিকার একটি তালিকা থাকবে। 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))

পাইথন 3 এ যেহেতু আনপ্যাকিংয়ের অনুমতি নেই [1] আমরা ব্যবহার করতে পারি

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

আপনি যদি ডিক হিসাবে আউটপুট চান, আপনি ব্যবহার করতে পারেন collections.OrderedDict:

import collections

sorted_dict = collections.OrderedDict(sorted_x)

43
মূল্য পরিকল্পনা অনুসারে বিভিন্ন অভিধানে বাছাইয়ের জন্য: Writonly.wordpress.com/2008/08/30/…
গ্রেগ লিন্ড

164
sorted_x.reverse()আপনাকে (একটি দ্বিতীয় টিপল উপাদান দ্বারা) একটি
অবতরণী অর্ডার দেবে

414
সাদিমু: যেহেতু আমরা ইতিমধ্যে ব্যবহার করছি sorted(), reverse=Trueযুক্তিটি পাস করার পক্ষে এটি আরও দক্ষ ।
আরএমএইচ

121
Python3 আমি একটি ল্যামডা ব্যবহৃত: sorted(d.items(), key=lambda x: x[1])। অজগর 2.x এ এই কাজ করবে?
কিও

84
অর্ডারডিক্ট সংগ্রহগুলিতে ২. 2. এ যুক্ত হয়েছে। বাছাইয়ের
মনকুট

1262

মতই সহজ: sorted(dict1, key=dict1.get)

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

যদি আপনি কী হিসাবে শব্দ এবং প্রতিটি শব্দের সংখ্যার সংখ্যার মান হিসাবে শব্দকোষ তৈরি করেন তবে এখানে সরলীকৃত:

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

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

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

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


31
এটিও ভাল তবে key=operator.itemgetter(1)দক্ষতার জন্য আরও স্কেলযোগ্য হওয়া উচিতkey=d.get
স্মৃতি

3
@ রায়লু আমি আইটেমটেটার ব্যবহার করে "কাজ করে না" আচরণটি পর্যবেক্ষণ করি: ----- from operator import itemgetter d = {"a":7, "b":1, "c":5, "d":3} sorted_keys = sorted(d, key=itemgetter, reverse=True) for key in sorted_keys: print "%s: %d" % (key, d[key]) ----- -> বি: 1 সি: 5 এ: 7 ডি: 3 ফলাফলগুলি প্রতিবার কোড চালানোর সময় পরিবর্তিত হয়: অদ্ভুত । (দুঃখিত, কোডটি সঠিকভাবে প্রদর্শনের জন্য পেতে পারেন না)
বালি

12
@ ব্লি sorted_keys = sorted(d.items(), key=itemgetter(1), reverse=True)এবং for key, val in sorted_keys: print "%s: %d" % (key, val)- আইটেমজিটার যখন ডাকা হয় তখন একটি ফাংশন তৈরি করে, আপনি এটি আপনার উদাহরণের মতো সরাসরি ব্যবহার করবেন না। এবং একটি ডিকের উপর একটি সরল পুনরাবৃত্তি মানগুলি ছাড়াই কীগুলি ব্যবহার করে
ইজকাটা

18
আমি আপনাকে ভবিষ্যতে বলতে এসেছি collections.Counter, যার একটি most_commonপদ্ধতি রয়েছে যা আপনার আগ্রহী হতে পারে :)
Eভী

2
@ ইভি - এটি রয়েছে যে, অ-এফ 2 এফ সংক্ষিপ্ত মন্তব্যে ভুল বোঝাবুঝির ঝুঁকি রয়েছে। অ্যামুজিং টিডবিট: collections.Counter২.7-এ যুক্ত হয়েছিল, যা প্রায় years বছর আগে প্রকাশিত হয়েছিল! (আমি তখন এটি সম্পর্কে জানতাম না - প্লাস আমি ব্রেভিটির উদ্দেশ্যে কোড-গল্ফ এড়িয়ে যেতে পারতাম, যা গেমের একমাত্র আবেগ)
নাস বানভ ২

857

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

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

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

এটিকে অবতরণ ক্রমে সাজানোর জন্য কেবল যুক্ত করুন reverse=True:

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

ইনপুট:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

আউটপুট:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]

আমি যা দেখেছি ( docs.python.org/2/library/… ) থেকে, অর্ডারডিক্ট নামে একটি শ্রেণি রয়েছে যা এখনও একটি অভিধান থাকা সত্ত্বেও সাজানো এবং অর্ডার বজায় রাখতে পারে। কোড উদাহরণগুলি থেকে, আপনি এটি বাছাই করতে ল্যাম্বডা ব্যবহার করতে পারেন, তবে আমি ব্যক্তিগতভাবে এটি চেষ্টা করে
দেখিনি

53
আমি key=lambda (k, v): vব্যক্তিগতভাবে পছন্দ করতাম
ক্লাদিউ

35
@ ক্লাডিউ আমি সেই (k, v)বাক্য গঠনটিও পছন্দ করি তবে এটি পাইথন 3 তে পাওয়া যায় না যেখানে টুপল প্যারামিটার আনপ্যাকিং সরানো হয়েছিল।
বব স্টেইন

2
dict(sorted(d.items(), key=lambda x: x[1]))
ডাঃহোপ

3
নং টিপলসের একটি বাছাই করা তালিকা থেকে ডিক তৈরি করা আবার আদেশটিকে মেরে ফেলেছে ...
জ্যান-ফ্রান্সোয়েস ফ্যাব্রে

233

ডিক্টগুলি বাছাই করা যায় না, তবে আপনি সেগুলি থেকে বাছাই করা তালিকা তৈরি করতে পারেন।

ডিক মানগুলির একটি সাজানো তালিকা:

sorted(d.values())

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

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

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

1
ডিকটগুলি এখন বাছাই করা যাবে সিপিথন ৩.6 থেকে শুরু করে এবং অন্যান্য সমস্ত পাইথন বাস্তবায়ন ৩. starting দিয়ে শুরু হবে
বরিস

161

সাম্প্রতিক পাইথন ২.7-এ, আমাদের কাছে নতুন অর্ডারডিক্ট টাইপ রয়েছে যা আইটেমগুলি যুক্ত করার ক্রমটি মনে করে।

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

5
এটি প্রশ্নটি যা তা নয় - এটি কীগুলির ক্রম বজায় রাখার বিষয়ে নয় তবে "মান অনুসারে বাছাই করা"
নাস বানভ

10
@ নাস বনভ: এটি কী দ্বারা বাছাই করা হচ্ছে না। এটি ক্রম অনুসারে বাছাই হচ্ছে, আমরা আইটেমগুলি তৈরি করি। আমাদের ক্ষেত্রে, আমরা মান অনুসারে বাছাই করি। দুর্ভাগ্যক্রমে, 3-আইটেম ডিকটি দুর্ভাগ্যক্রমে বেছে নেওয়া হয়েছিল যাতে আদেশটি একই ছিল, যখন মান এবং কী অনুসারে মজাদার সাজানো হয়েছিল, তাই আমি নমুনা ডিকটি প্রসারিত করেছি।
মাইখাল

sorted(d.items(), key=lambda x: x[1])আপনি কি বোঝাতে xপারবেন এর অর্থ কী, কেন এটি x[1]ল্যাম্বডায় নিতে পারে? কেন হতে পারে না x[0]? আপনাকে অনেক ধন্যবাদ!
জেজেডিইউ

1
@ বোর্ন টিপলসের d.items()তালিকার মতো একটি ধারক ফেরত দেয় (key, value)[0]টিপলের প্রথম উপাদানটি - কী - এবং [1]দ্বিতীয় উপাদানটি - অ্যাক্সেস করে।
বলপয়েন্টবেন

2
দ্রষ্টব্য: ৩.6 (সিপিথন / পাইপাই বাস্তবায়ন বিশদ হিসাবে) এবং ৩.7 হিসাবে (পাইথন ভাষার গ্যারান্টি হিসাবে), সরল dictসন্নিবেশকেও আদেশ করা হয়েছে, সুতরাং আপনি কেবল প্রতিস্থাপন করতে পারেনOrderedDict সঙ্গে dictকোডের জন্য আধুনিক পাইথন চলমান। OrderedDictযদি আপনার কোনও বিদ্যমান dict( move_to_end/ / popitem) ক্রম পুনরায় সাজানোর প্রয়োজন না হয় বা অর্ডার-সংবেদনশীল হওয়ার জন্য সমতার তুলনা প্রয়োজন হয় না তবে সত্যই আর প্রয়োজন হয় না । এটি প্লেইনের থেকে অনেক বেশি স্মৃতি ব্যবহার করে dict, তাই পারলে , dictযাওয়ার উপায়।
শ্যাডোর্যাঞ্জার

104

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

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

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

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

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

86

হ্যাঙ্ক গে এর উত্তরের মতো অনেক সুন্দর :

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

অথবা জন ফুহির পরামর্শ অনুসারে কিছুটা অপ্টিমাইজড:

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

9
.. এবং হ্যাঙ্ক গে এর উত্তরের মতো আপনার বর্গাকার বন্ধনীগুলির দরকার নেই। সাজানো () জেনারেটর এক্সপ্রেশন হিসাবে আনন্দের সাথে কোনও পুনরাবৃত্তিযোগ্য গ্রহণ করবে।
জন ফুহি

(কী, মান) দিয়ে শেষ করতে আপনাকে এখনও (মান, কী) টিপল উপাদানগুলি অদলবদল করতে হবে। এর পরে আর একটি তালিকা বোঝার প্রয়োজন। [(key, value) for (value, key) in sorted_list_of_tuples]
সাদিমু আপলে

না, স্কোয়ার বন্ধনীগুলি ছেড়ে দেওয়া ভাল, কারণ sortedযেভাবেই তালিকাটি পুনর্নির্মাণ করতে হবে এবং জেনকম্প থেকে পুনর্নির্মাণ আরও দ্রুত হবে। কোডগলফিংয়ের পক্ষে ভাল, গতির পক্ষে খারাপ। কুরুচিপূর্ণ ([])সংস্করণ রাখুন ।
জিন-

75

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

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

সর্বনিম্ন স্কোর দিয়ে বাছাই প্রথম:

worst = sorted(Player(v,k) for (k,v) in d.items())

প্রথমে সর্বোচ্চ স্কোর দিয়ে বাছাই:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

এখন আপনি এর নাম এবং স্কোর পেতে পারেন, আসুন দ্বিতীয় সেরা প্লেয়ারটি (সূচক = 1) খুব পাইথোনিকভাবে এটির মতো বলুন:

player = best[1]
player.name
    'Richard'
player.score
    7

কীভাবে আমি এটি আবার অভিধানে রূপান্তর করতে পারি?
রোয়ানা

as_list = [d.items () এর (k, v) এর জন্য প্লেয়ার (v, কে) as_dict = ডিক ((p.name, p.score) as_list এ পি জন্য)
রেমি

72

পাইথন ৩.6 হিসাবে বিল্ট-ইন ডিকের আদেশ দেওয়া হবে

সুসংবাদ, সুতরাং ওপি-র মূল ব্যবহারের ক্ষেত্রে মাইপিং জোড়গুলির ডেটাবেস থেকে অনন্য স্ট্রিং আইডি হিসাবে কী এবং সংখ্যাগত মান হিসাবে অন্তর্নির্মিত পাইথন ভি .6..6 + ডিকের মধ্যে মান হিসাবে মান সংগ্রহ করা উচিত in

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

SELECT a_key, a_value FROM a_table ORDER BY a_value;

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

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

বিবরণ:

২০১২ সালে রেমন্ড হেট্টিংগার প্রস্তাব করেছিলেন ( "দ্রুত পুনরাবৃত্তির সাথে আরও কমপ্যাক্ট অভিধান" সাবজেক্ট সহ পাইফন-ডেভেলের সিএফ মেল ) এবং এখন (২০১ 2016 সালে) ভিক্টর স্টিনারের একটি মেইলে ঘোষণা করেছিলেন "পাইথন ৩.6 ডিক কমপ্যাক্ট এবং একটি ব্যক্তিগত সংস্করণ পায়; এবং কীওয়ার্ডগুলি " ইস্যু 27350 সংশোধন / বাস্তবায়নের কারণে " কমপ্যাক্ট এবং আদেশযুক্ত ডিক "অর্ডার হয়ে যায়" পাইথন 3.6 ফলে আমরা এখন সন্নিবেশ ক্রম বজায় রাখতে একটি বিল্ট-ইন ডিক ব্যবহার করতে সক্ষম হব !!

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

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

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

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

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

রেমন্ড হেইটিঙ্গার দয়া করে " দ্য টেক বিহাইন্ড পাইথন ৩. D ডিকশনারি " ব্যাখ্যা করার জন্য ডকুমেন্টেশন সরবরাহ করেছিলেন - তার সান ফ্রান্সিসকো পাইথন মিটআপ গ্রুপ উপস্থাপনা থেকে 2016-ডিসি -08।

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

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

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

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

আপডেট 2017-12-15:

অজগর-দেব তালিকার একটি মেইলে গুইডো ভ্যান রসুম ঘোষণা করেছিলেন:

তেমনই করে ফেলো. "ডিক্ট সন্নিবেশের আদেশ রাখে" এই রায়। ধন্যবাদ!

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


15
আপনি যে 'নতুন' পৃষ্ঠায় লিঙ্ক করেছেন তার সতর্কতার উপর জোর দেওয়া উচিত: এই নতুন বাস্তবায়নের ক্রম-সংরক্ষণের দিকটি একটি বাস্তবায়ন বিশদ হিসাবে বিবেচিত হয় এবং এর উপর নির্ভর করা উচিত নয় । কেউ অনুমান করা উচিত নয় যে এই dictধরণটি তাদের কোডটিতে সন্নিবেশ ক্রমের সম্মান করবে। এটি ভাষার সংজ্ঞাটির অংশ নয় এবং বাস্তবায়ন ভবিষ্যতের যে কোনও প্রকাশে পরিবর্তিত হতে পারে। OrderedDictঅর্ডার গ্যারান্টি ব্যবহার করা চালিয়ে যান ।
অ্যালেক্স রিলি

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

OrderedDictঅবশ্যই বাদ দেওয়া হবে না; পরিবর্তে, এটি বর্তমান ডিক বাস্তবায়নের চারপাশে একটি পাতলা মোড়ক হয়ে উঠবে (যাতে আপনি যুক্ত করতে পারেন যে এটি আরও কমপ্যাক্ট হয়ে উঠবে)) ImportErrorপাঠকদের বিভ্রান্ত করার কারণে এর সাথে স্নিপেট যোগ করা বেশ ভাল ধারণা নয় কারণ OrderedDictএর কোনও ব্যবহার নেই।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

@ জিমফাসারাকিস-হিলিয়ার্ড আপনাকে প্রতিক্রিয়া জানাতে ধন্যবাদ জানায়। "বেশ ভাল ধারণা" আমাকে হাসি দিয়েছিল - ভবিষ্যতের ভবিষ্যদ্বাণী প্রায়শই কঠিন। তবে আমার মতামতটি আপনার উত্সটি সূত্রগুলি পরীক্ষা করে দেখুন, চেষ্টা করুন এবং তারপরে উত্তরটি আপডেট করুন। আবার ধন্যবাদ.
বিস্ময়কর

8
@ অ্যালেক্সরিলে এই সতর্কতা আর সঠিক নয়। পাইথন 3.7 গ্যারান্টিযুক্ত আদেশযুক্ত অভিধানগুলি।
অঙ্কুরিত

42

আমারও একই সমস্যা ছিল এবং আমি এটি এর মতো সমাধান করেছি:

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

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

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


1
আপনি ফলাফলটি থেকে মূল্য
হারাচ্ছেন

মনে রাখবেন যে আপনি উভয়ই অভিধানটি পুনরাবৃত্তি করছেন এবং তাদের কী দ্বারা মানগুলি আনছেন, সুতরাং কার্য সম্পাদন অনুযায়ী এটি কোনও অনুকূল সমাধান নয়।
রন ক্লেইন

1
@ ডিজেল: যেমনটি অবদানকারী বলেছেন, তিনি প্রশ্নের ব্যাখ্যা করেছেন "আমি কী মূল্যগুলির অনুসারে বাছাই করা কীগুলির তালিকা পেতে পারি" " ফলস্বরূপ আমাদের মানগুলির দরকার নেই, আমাদের অভিধানে রয়েছে।
সর্বোচ্চ

36

আপনার কাছে ব্যবহার করতে পারেন তাহলে মান সাংখ্যিক হয় Counterথেকে সংগ্রহ

from collections import Counter

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

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

আপনার
অভিধানটি

@yopy Counter({'hello':1, 'python':5, 'world':300}).most_common()দেয় [('world', 300), ('python', 5), ('hello', 1)]। এটি আসলে যেকোনও বাছাইযোগ্য মান ধরণের জন্য কাজ করে (যদিও অন্যান্য অনেক কাউন্টার অপারেশনের ক্ষেত্রে ইনটের সাথে তুলনীয় মানের প্রয়োজন হয়)।
lvc

34

পাইথন ২.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- উদাহরণ- রেসিপি

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


25

এই কোড:

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}

25

নিম্নলিখিত পদ্ধতির চেষ্টা করুন। আসুন নিম্নলিখিত ডেটা সহ মাইডিক্ট নামক একটি অভিধানটি সংজ্ঞা দিন:

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

অসাধারণ! for key, value in sorted(mydict.iteritems(), key=lambda (k,v): v["score"]):আপনাকে
সাবকি

এটি আমাকে পাইথন 3 এর ল্যাম্বদার কাছে সিনট্যাক্স ত্রুটি দেয়
সুলায়মান এলাহী

21

পাইথন ৩.6 থেকে শুরু করে, dictঅবজেক্টগুলি এখন সন্নিবেশ ক্রমের দ্বারা অর্ডার করা হয়েছে। এটি আনুষ্ঠানিকভাবে পাইথন 3.7 এর চশমাগুলিতে।

>>> words = {"python": 2, "blah": 4, "alice": 3}
>>> dict(sorted(words.items(), key=lambda x: x[1]))
{'python': 2, 'alice': 3, 'blah': 4}

তার আগে, আপনাকে ব্যবহার করতে হবে OrderedDict

পাইথন ৩.7 নথিটিতে বলা হয়েছে:

সংস্করণ 3.7 এ পরিবর্তিত হয়েছে: অভিধান ক্রম সন্নিবেশ ক্রমের গ্যারান্টিযুক্ত। এই আচরণটি সিপিথনের বাস্তবায়ন বিবরণ ছিল 3.6 থেকে।


দুর্দান্ত কাজ! dict(sorted(words.items(), key=lambda x: x[1], reverse=True))
ডিইএসসির

20

আপনি একটি "ইনভার্টেড ইনডেক্স" তৈরি করতে পারেন

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]

19

আপনি সংগ্রহগুলি ব্যবহার করতে পারেন oun কাউন্টার । দ্রষ্টব্য, এটি উভয় সংখ্যাসূচক এবং অ-সংখ্যাসূচক মানের জন্য কাজ করবে।

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

7
ইভান সাস এর উত্তর থেকে এটি কীভাবে আলাদা ?
পিটার মর্টেনসেন

15

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

>>> 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() তারপর আপনি সাজানো ক্রম মান পুনরুক্তি করব।

এটি এড়িয়ে যান তালিকা উপাত্ত কাঠামো ব্যবহার করে ।


এখনই কি আমরা সাজানোর ক্রমটি পরিবর্তন করতে পারি, এটি সাজানো, তবে আমি ক্ষয়িষ্ণু হতে চাই।
সুলেমান এলাহী

আফাইক ক্রমটি ফিরিয়ে আনতে আপনাকে আপনার মূল্যবোধগুলি তুচ্ছ করতে হবে
ম্যালথে

বাহ, আমি মনে করি না ... ধন্যবাদ।
সুলেমান এলাহী

14

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

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)

12
from django.utils.datastructures import SortedDict

def sortedDictByKey(self,data):
    """Sorted dictionary order by key"""
    sortedDict = SortedDict()
    if data:
        if isinstance(data, dict):
            sortedKey = sorted(data.keys())
            for k in sortedKey:
                sortedDict[k] = data[k]
    return sortedDict

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

10

ডিলিট্যান্ট দ্বারা চিহ্নিত হিসাবে , পাইথন 3.6 এখন অর্ডার রাখবে ! আমি ভেবেছিলাম যে আমি লিখেছি এমন একটি ফাংশন ভাগ করব যা একটি পুনরাবৃত্ত (বাছাই, তালিকা, ডিক) এর বাছাইকে সহজ করে দেয়। পরবর্তী ক্ষেত্রে, আপনি কী বা মানগুলিতে বাছাই করতে পারেন এবং এটি সংখ্যার তুলনাটিকে বিবেচনায় নিতে পারে। কেবল> = 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")

9

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

এটি জিপ () ব্যবহার করে জোড় (মান, কী) জোড় তৈরি করতে দেয়: জোড়া = জিপ (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')]

9

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

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

আপনার কাছে পাইথন ২. or বা তার বেশি না থাকলে জেনারেটর ফাংশনটিতে মানগুলি নিয়ে পুনরাবৃত্তি করতে পারেন। (একটা হল OrderedDict2.4 ও 2.6-এর জন্য এখানে কিন্তু

ক) আমি জানি না এটি কতটা ভাল কাজ করে

এবং

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


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)

দয়া করে পাইথন ৩.০ বা তার বেশি ব্যবহার না করে মুদ্রণের পরে প্রথম বন্ধনী সরিয়ে ফেলতে ভুলবেন না


নিয়মিত পাইথন অভিধানগুলি মূল ক্রমটি রাখে না - পাইথন ৩.7 হিসাবে তারা করে।
অঙ্কুরিত

7

ব্যবহার করুন ValueSortedDict থেকে dicts :

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


6

প্রত্যেকের জন্য পাইথন থেকে প্রাসঙ্গিক দক্ষতা শিখেছি ।

অভিধানটি বাছাই করতে আপনি একটি অস্থায়ী তালিকা ব্যবহার করতে পারেন:

#Assume dictionary to be:
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}

# create a temporary list
tmp = []

# iterate through the dictionary and append each tuple into the temporary list 
for key, value in d.items():
    tmptuple = (value, key)
    tmp.append(tmptuple)

# sort the list in ascending order
tmp = sorted(tmp)

print (tmp)

আপনি যদি তালিকাটিকে অবতরণ ক্রমে বাছাই করতে চান তবে কেবলমাত্র মূল বাছাইয়ের লাইনটি এতে পরিবর্তন করুন:

tmp = sorted(tmp, reverse=True)

তালিকা বোধগম্যতা ব্যবহার করে, একটি লাইনারটি হ'ল:

#Assuming the dictionary looks like
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}
#One liner for sorting in ascending order
print (sorted([(v, k) for k, v in d.items()]))
#One liner for sorting in descending order
print (sorted([(v, k) for k, v in d.items()], reverse=True))

নমুনা আউটপুট:

#Asending order
[(1.0, 'orange'), (500.1, 'apple'), (789.0, 'pineapple'), (1500.2, 'banana')]
#Descending order
[(1500.2, 'banana'), (789.0, 'pineapple'), (500.1, 'apple'), (1.0, 'orange')]

এটি মান দ্বারা নয় কী দ্বারা বাছাই করা হয়।
রুবেল

আপনি যদি প্রাথমিক বিন্যাসে এটি মুদ্রণ করতে চান তবে আপনার করা উচিত: মুদ্রণ ([(k, v) এর জন্য v, কে সাজানো ([(v, কে) কে জন্য, ডি ইনসাইট ()])])) print আউটপুটটি হ'ল: [('কমলা', 1.0), ('আপেল', 500.1), ('আনারস', 789.0), ('কলা', 1500.2)]। [(কে, ভি) এর সাথে ভি, কে ইন সাজানো ([(v, কে) কে এর জন্য, ডি ইনাইটস ()), বিপরীত = সত্য)] আউটপুটটি হ'ল: [('কলা', 1500.2), ('আনারস', 789.0), ('আপেল', 500.1), ('কমলা', 1.0)]
হার্মিস মোরেলস

5

একটি ডিকের মাধ্যমে ইট্রেট করুন এবং এটির মান অনুসারে সাজানো ক্রম অনুসারে সাজান:

$ python --version
Python 3.2.2

$ cat sort_dict_by_val_desc.py 
dictionary = dict(siis = 1, sana = 2, joka = 3, tuli = 4, aina = 5)
for word in sorted(dictionary, key=dictionary.get, reverse=True):
  print(word, dictionary[word])

$ python sort_dict_by_val_desc.py 
aina 5
tuli 4
joka 3
sana 2
siis 1

5

যদি আপনার মানগুলি পূর্ণসংখ্যার হয় এবং আপনি পাইথন ২.7 বা collections.Counterতার বেশি ব্যবহার করেন তবে আপনি এর পরিবর্তে ব্যবহার করতে পারেন dictmost_commonপদ্ধতি সব আইটেম, মান অনুসারে সাজানো দেব।


5

সম্পূর্ণতার জন্য, আমি হ্যাপক ব্যবহার করে একটি সমাধান পোস্ট করছি । দ্রষ্টব্য, এই পদ্ধতিটি উভয় সংখ্যাসূচক এবং অ-সংখ্যাসূচক মানের জন্য কাজ করবে

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> x_items = x.items()
>>> heapq.heapify(x_items)
>>> #To sort in reverse order
>>> heapq.nlargest(len(x_items),x_items, operator.itemgetter(1))
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> heapq.nsmallest(len(x_items),x_items, operator.itemgetter(1))
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

4

পাইথনের পুরানো সংস্করণগুলির সাথে পশ্চাদপটে সামঞ্জস্যতা বজায় রাখার প্রয়োজনীয়তার কারণে আমি মনে করি অর্ডারডিক্ট সমাধানটি খুব বোকামি। আপনি পাইথন ২.7 এবং পুরানো সংস্করণগুলির সাথে কাজ করে এমন কিছু চান।

কিন্তু অন্য উত্তরে বর্ণিত সংগ্রহ সমাধানগুলি একেবারে দুর্দান্ত, কারণ আপনি কী এবং মানের মধ্যে একটি সংযোগ পুনরুদ্ধার করেন যা অভিধানের ক্ষেত্রে অত্যন্ত গুরুত্বপূর্ণ।

আমি অন্য উত্তরে উপস্থাপিত প্রথম নম্বরটির সাথে একমত নই, কারণ এটি কীগুলি ফেলে দেয়।

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

from collections import Counter

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


>> [('python', 5), ('world', 3), ('hello', 1)]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.