একটি অভিধানে সূচি কিভাবে?


97

আমার নীচে একটি অভিধান রয়েছে:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

আমি অভিধানে প্রথম এন্ট্রিটিকে কীভাবে সূচক করব?

colors[0]KeyErrorসুস্পষ্ট কারণে একটি ফিরে আসবে ।


4
"প্রথম" অর্থ কী? অভিধানের কোনও অর্ডার নেই।
এস .লট

4
অভিধানের এখন সন্নিবেশ পাইথন 3.7 থেকে নির্দেশ দেওয়া হয় এই পরীক্ষা করে দেখুন: stackoverflow.com/questions/39980323/...
নিকিতা Alkhovik


4
@ এস.লট আমি বাজি ধরছি যে সে যদি জানতে পারে যে তারা বিন্যস্ত ছিল :)
ব্যবহারকারী 7778287

উত্তর:


113

পাইথন ৩.6 পর্যন্ত এবং পাইথন সংস্করণগুলিতে ডিকোরিটিগুলি আনঅর্ডার করা হয়। আপনি এন্ট্রি অর্ডার যত্নশীল না করেন এবং যাহাই হউক না কেন কী বা ইনডেক্স দ্বারা মান অ্যাক্সেস করতে চান, আপনি ব্যবহার করতে পারেন d.keys()[i]এবং d.values()[i]বা d.items()[i]। (দ্রষ্টব্য যে এই পদ্ধতিগুলি পাইথন ২.x এ সমস্ত কী, মান বা আইটেমের একটি তালিকা তৈরি করে So সুতরাং আপনার যদি আরও একবার প্রয়োজন হয় তবে কর্মক্ষমতা উন্নত করতে তালিকাটি একটি পরিবর্তনশীলতে সংরক্ষণ করুন))

আপনি যদি পাইথন ২.7 দিয়ে শুরু করে এন্ট্রিগুলির ক্রম সম্পর্কে যত্নশীল হন তবে আপনি ব্যবহার করতে পারেন collections.OrderedDict। অথবা জোড়ের তালিকা ব্যবহার করুন

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

যদি আপনার কী দ্বারা অ্যাক্সেসের প্রয়োজন না হয়। (কেন আপনার সংখ্যাগুলি স্ট্রিং করছে?)

পাইথন ৩.7-এ, সাধারণ অভিধানগুলি অর্ডার করা হয়, সুতরাং আপনার OrderedDictআর ব্যবহার করার দরকার নেই (তবে আপনি এখনও করতে পারেন - এটি মূলত একই ধরণের)। পাইথন ৩.6-এর সিপিথন বাস্তবায়ন ইতিমধ্যে সেই পরিবর্তনটি অন্তর্ভুক্ত করেছে, তবে এটি ভাষা নির্দিষ্টকরণের অংশ না হওয়ায় আপনি পাইথন ৩.6 এ নির্ভর করতে পারবেন না।


4
পাইথন 2-এ, কোনও কীগুলি সরিয়ে না ফেলে তা পরীক্ষা করার d.iterkeys().next()পরিবর্তে ব্যবহার করুন d.keys()[0]। যদি অভিধানটি বিশাল হয় তবে এটি পারফরম্যান্সের ক্ষেত্রে একটি বড় পার্থক্য আনবে। একই মান এবং আইটেম জন্য যায়। পাইথন ২.7 এ আপনি
ডোক

44
পাইথন 3-এ, এই কলগুলি একটি আসল তালিকার পরিবর্তে একটি ভিউ দেয়। : এই তাই প্রশ্ন দেখুন stackoverflow.com/questions/17431638/...
stifin

4
কেবলমাত্র একটি সংশোধন করার জন্য: আপনি আইটেমগুলি সূচী করতে পারবেন না (), পাইথন কমপক্ষে 3
জন স্ট্রং

4
এই উত্তরটি অজগর 3.6+ এর পুরানো, দয়া করে নীচে @ পাশা দ্বারা উত্তর দেখুন।
হ্যান্স

4
@ হ্যানস এই উত্তরটি পাইথন ৩.7-এর পুরানো, তবে পাইথন ৩.6-এর জন্য নয়, যেহেতু অভিধানের ক্রম-সংরক্ষণের অভিধানটি পাইথন সংস্করণটির সিপিথন প্রয়োগের একটি বাস্তবায়ন বিবরণ, ভাষার কোনও সরকারী অংশ নয় not আমি এই উত্তরটি সেই অনুযায়ী আপডেট করব।
সোভেন মারনাচ

115

যদি এখনও কেউ এই প্রশ্নটির দিকে তাকাচ্ছেন তবে বর্তমানে গৃহীত উত্তরগুলি এখন পুরানো:

যেহেতু পাইথন ৩.7 * অভিধানগুলি অর্ডার-সংরক্ষণযোগ্য , সে কারণেই তারা এখন ঠিক তেমন collections.OrderedDictব্যবহার করে। দুর্ভাগ্যক্রমে, অভিধান keys()/ values()এর সূচীকরণের জন্য এখনও কোনও উত্সর্গীকৃত পদ্ধতি নেই , সুতরাং অভিধানে প্রথম কী / মান পাওয়া হিসাবে করা যেতে পারে

first_key = list(colors)[0]
first_val = list(colors.values())[0]

বা বিকল্পভাবে (এটি তালিকার কীগুলি তাত্ক্ষণিক করে তোলা এড়াতে পারে):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

আপনার যদি একটি nঅ্যান্থ কী প্রয়োজন হয় তবে একইভাবে

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

(* সিপথন ৩.6 এর মধ্যে ইতিমধ্যে অর্ডার করা ডিক্টস অন্তর্ভুক্ত ছিল তবে এটি কেবল একটি বাস্তবায়নের বিশদ ছিল। ভাষা স্পেসিফিকেশনটিতে 7. from থেকে অর্ডারযুক্ত ডিক্টস অন্তর্ভুক্ত রয়েছে।)


অনুগ্রহ করে সংশ্লিষ্ট ডকুমেন্টেশনের লিঙ্কটি সরবরাহ করতে পারেন?
আমির আফিয়ানান

3

অভিধানের কোনও উপাদানকে সম্বোধন করা গাধার উপরে বসে যাত্রা উপভোগ করার মতো।

পাইথনের নিয়ম হিসাবে অধ্যায়টি অর্ডারহীন

আছে যদি

dic = {1: "a", 2: "aa", 3: "aaa"}

এখন ধরুন আমি যদি এইরকম হয়ে যাই dic[10] = "b"তবে এটি সর্বদা এর মতো যুক্ত হয় না

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

এটি হতে পারে

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

বা

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

বা

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

বা এই জাতীয় কোনও সংমিশ্রণ।

থাম্ব নিয়ম তাই হয় অভিধান হল আদেশহীন !


এটি খুব সংকীর্ণ ... আমি এটা পছন্দ করি!
অ্যালেক্স লিউ 33214


2

আসলে আমি একটি অভিনব সমাধান খুঁজে পেয়েছি যা সত্যিই আমাকে সাহায্য করেছিল, আপনি যদি বিশেষত কোনও তালিকা বা ডেটা সেটের নির্দিষ্ট মানের সূচক সম্পর্কে উদ্বিগ্ন হন তবে আপনি কেবলমাত্র সেই সূচকে অভিধানের মান সেট করতে পারেন !:

শুধু দেখ:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

এখন হ্যাশম্যাপের শক্তির মাধ্যমে আপনি স্থির সময়ে সূচকে আপনার এন্ট্রিগুলি টেনে আনতে পারেন (পুরো অনেক দ্রুত)


1

ওহ, এটি একটি কঠিন। আপনার এখানে যা আছে তা মূলত প্রতিটি আইটেমের জন্য দুটি মান। তারপরে আপনি কী হিসাবে তাদের একটি নম্বর দিয়ে কল করার চেষ্টা করছেন। দুর্ভাগ্যক্রমে, আপনার মানগুলির মধ্যে একটি ইতিমধ্যে কী হিসাবে সেট করা আছে!

এটা চেষ্টা কর:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

এখন আপনি কীগুলি সংখ্যা অনুসারে কল করতে পারেন যেন সেগুলি তালিকার মতো সূচিযুক্ত হয়। আপনি তালিকার মধ্যে তাদের অবস্থান অনুসারে রঙ এবং সংখ্যা উল্লেখ করতে পারেন।

উদাহরণ স্বরূপ,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

অবশ্যই, আপনাকে প্রতিটি রঙ কী অবস্থানে রয়েছে সে সম্পর্কে নজর রাখার আরেকটি উপায় নিয়ে আসতে হবে Maybe সম্ভবত আপনার কাছে অন্য একটি অভিধান থাকতে পারে যা প্রতিটি রঙের কী এর মান হিসাবে সংরক্ষণ করে।

color_key = {'নীল': 1, 'লাল': 6, 'ইয়োলো': 8

তারপরে, আপনার প্রয়োজন হলে রঙগুলির কীও সন্ধান করতে সক্ষম হবেন।

রং [color_key ['নীল']] [0] 'নীল' ফিরবে

এরকম কিছু.

এবং তারপরে, আপনি যখন যাচ্ছেন, আপনি কী হিসাবে সংখ্যা মানগুলি দিয়ে একটি ডিক তৈরি করতে পারেন যাতে আপনি সর্বদা সেগুলি আপনার রঙগুলি সন্ধান করতে ব্যবহার করতে পারেন, আপনার যদি প্রয়োজন হয় তবে আপনি জানেন।

মান = {5: [1, 'নীল'], 6: [2, 'লাল'], 8: [3, 'হলুদ']}

তারপরে, (রঙগুলি [color_key [মানগুলি [5] [1]]] [[0]) 'নীল' ফিরবে।

অথবা আপনি তালিকার একটি তালিকা ব্যবহার করতে পারেন।

শুভকামনা!


0

আপনি পারবেন না, যেহেতু dictঅর্ডারড নয়। আপনি .popitem()একটি স্বেচ্ছাসেবী আইটেম পেতে ব্যবহার করতে পারেন , কিন্তু এটি ডিক থেকে এটি সরিয়ে ফেলবে।


next(iter(d.items()))( .iteritems()পাইথন 2 এ) আপনাকে পাশাপাশি একটি স্বেচ্ছাসেবী আইটেম দেয় (আমার পরীক্ষাগুলিতে একই, যেহেতু এটি ব্যবহার করে পপাইটেম প্রয়োগ করা যেতে পারে) তবে আইটেমটি সরাবে না।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.