সূচক দ্বারা পাইথন অভিধানের উপাদানগুলি অ্যাক্সেস করা


118

মত একটি ডিক বিবেচনা করুন

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

আমি উদাহরণস্বরূপ এই অভিধানের একটি নির্দিষ্ট উপাদান অ্যাক্সেস করব? উদাহরণস্বরূপ, আমি অ্যাপলের প্রথম উপাদানটি ফর্ম্যাট করার পরে প্রথম উপাদানটি মুদ্রণ করতে চাই যা আমাদের ক্ষেত্রে কেবল 'আমেরিকান'?

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

আমি আমার ফাংশনে এই ডেটা স্ট্রাকচারটি ব্যবহার করছি।

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


2
আপনি অনুগ্রহ করে আউটপুটটির একটি উদাহরণ দিতে পারেন?
বিজার্ন পোল্লেক্স

3
আপনি এই কাঠামোর সাথে আসলে কী করতে চান? এবং আপনি কি ডিকের কীগুলি জানেন ('উদাহরণস্বরূপ' অ্যাপল 'এবং' আঙ্গুর ')? অথবা আপনি কেবল জানেন যে আপনি ডিক্টসের ডিক পাবেন?
জুয়ানচোপাঞ্জা

6
আপনার অভিধানটি কল করবেন না dict। 'ডিক' শব্দটি পাইথনের ইতিমধ্যে একটি কীওয়ার্ড। মত অন্য কিছু ব্যবহার করুন mydict
রিক

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

@ আরান-ফে: আনঅর্ডারার্ড জিনিসগুলির একটি অভ্যন্তরীণ ক্রম রয়েছে। অর্ডারড! = অর্ডার নেই।
জেমি মার্শাল

উত্তর:


122

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

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

এবং তাদের মধ্যে কতজন আমেরিকান (16), এই জাতীয়করণ করুন:

>>> mydict["Apple"]["American"]
'16'

9
উপাদানগুলির গভীরতা না জেনে কেউ কীভাবে এই গতিশীল করতে পারে?
ইথান বিয়ারলাইন

3
আপনি ঠিক কী জানতে চান? আপনি এর সাথে অভিধানের কীগুলি পেতে পারেন .keys()যাতে আপনি এগুলিকে গতিময়ভাবে অ্যাক্সেস করতে পারেন।
মর্টেন ক্রিস্টেনসেন

3
যেমন, উদাহরণস্বরূপ, যদি আপনার অজানা গভীরতার একটি অভিধান থাকে, উদাহরণস্বরূপ, একটি নেস্টেড ডিকশনারি এবং আপনার "n"অজানা গভীরতায় উপাদান রয়েছে যা কোনও অজানা উপাদানে সঞ্চিত রয়েছে।
ইথান বিয়ারলাইন

1
এটি খুব বিস্তৃত প্রশ্ন। আপনার ডেটা কাঠামো দেওয়া আপনি তার পরে যথাযথভাবে পরিচালনা করতে কোনও ফাংশন বা শ্রেণি লিখবেন। সম্ভবত আপনি কীটি অনুসন্ধান করার চেষ্টা করার জন্য একটি কী এবং কৌশল সরবরাহ করতে পারেন।
মর্টেন ক্রিস্টেনসেন

1
@ ইথানবিয়ারলাইন ব্যবহার করুন: 'কী এর জন্য, অভিধান.সাইটাইটেমগুলিতে মান ()' কী এবং মান উভয়ের অ্যাক্সেস পেতে
ডানিয়াস

25

যদি প্রশ্নগুলি হয়, আমি যদি জানি যে আমার কাছে একটি ডিক্টের ডিক আছে যা ফল হিসাবে 'অ্যাপল' এবং 'আমেরিকান' এক ধরণের আপেল হিসাবে ব্যবহার করে, আমি এটি ব্যবহার করব:

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }


print myDict['Apple']['American']

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

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

বা আরও ভাল তাই আপনি অজানাভাবে ডিক্টসের পুরো ডিকটি নিয়ে পুনরাবৃত্তি করবেন না যদি আপনি জানেন যে কেবল অ্যাপলের কাছে আমেরিকান টাইপ রয়েছে:

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

এই সমস্ত ক্ষেত্রে অভিধানগুলি আসলে প্রবেশাগুলি কীভাবে অর্ডার করে তা বিবেচনা করে না। আপনি যদি অর্ডারটি সম্পর্কে সত্যই উদ্বিগ্ন হন তবে আপনি এটি ব্যবহার করে বিবেচনা করতে পারেন OrderedDict:

http://docs.python.org/dev/library/collections.html#collections.OrderedDict


20

আমি যেমন আপনার বিবরণ লক্ষ্য করেছি, আপনি কেবল জানেন যে আপনার পার্সার আপনাকে একটি অভিধান দেবে যে এর মানগুলিও এর মতো অভিধান:

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

সুতরাং আপনাকে আপনার পিতামাতার অভিধানটি পুনরুক্ত করতে হবে। আপনি যদি sampleDict.values()তালিকার সমস্ত প্রথম অভিধান কী মুদ্রণ করতে বা অ্যাক্সেস করতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

for key, value in sampleDict.items():
    print value.keys()[0]

আপনি যদি প্রথম আইটেমটির প্রথম কীটি অ্যাক্সেস করতে চান তবে এটি কার্যকর sampleDict.values()হতে পারে:

print sampleDict.values()[0].keys()[0]

আপনি প্রশ্নে যে উদাহরণ দিয়েছেন তা যদি আপনি ব্যবহার করেন তবে আমার অর্থ:

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

প্রথম কোডের আউটপুট হল:

American
Indian

এবং দ্বিতীয় কোডের আউটপুট হল:

American

10

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

পাইপিতে এটি সম্পর্কিত কিছু আকর্ষণীয় গ্রন্থাগার রয়েছে, এখানে আপনার জন্য একটি দ্রুত অনুসন্ধান

আপনার নির্দিষ্ট ক্ষেত্রে, ডিক_ডিজার উপযুক্ত বলে মনে হচ্ছে।

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

8

আপনি অভিধানে dict['Apple'].keys()[0]প্রথম কীটি পেতে ব্যবহার করতে পারেন Apple, তবে এটির কোনও গ্যারান্টি নেই American। অভিধানের কীসের ক্রম অভিধানের বিষয়বস্তুর উপর নির্ভর করে এবং কীগুলি যুক্ত করা হয়েছিল তার ক্রম অনুসারে পরিবর্তন করতে পারে।


আপনি যদি গ্রন্থাগারে ব্যবহার OrderedDictনা করেনcollections
Escachator

7

আমি জানি এটি 8 বছর বয়সী, তবে কেউই বাস্তবে প্রশ্নটি পড়ে এবং উত্তর দিয়েছে বলে মনে হয় না।

অভ্যন্তরীণ ডিক্টের একটি তালিকা পেতে আপনি ডিক্টিকে .values ​​() কল করতে পারেন এবং এভাবে সূচী দ্বারা সেগুলি অ্যাক্সেস করতে পারেন।

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']

2
আকর্ষণীয়, আমি এটি চেষ্টা করেছিলাম এবং পেয়েছি 'dict_values' object does not support indexing । Guess যেহেতু আপনি একটি তালিকা পুনরুদ্ধার করতে dict_values মোড়ানো প্রয়োজন এই উত্তরটি একটি আপডেট প্রয়োজন
Yuca

1
@ ইউক্কা - আপনি সঠিক ছিলেন, আমি আমার কোড পরীক্ষা করিনি। উত্তর আপডেট করা হয়েছে
জেমি মার্শাল

4

আপনি অভিধানের উপর অর্ডার উপর নির্ভর করতে পারবেন না। তবে আপনি এটি চেষ্টা করতে পারেন:

dict['Apple'].items()[0][0]

আপনি যদি অর্ডারটি সংরক্ষণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api


2

অভিধানে উপাদানগুলির অ্যাক্সেস কীভাবে তা বোঝার সহজ উদাহরণ: -

একটি অভিধান তৈরি করুন

d = {'dog' : 'bark', 'cat' : 'meow' } 
print(d.get('cat'))
print(d.get('lion'))
print(d.get('lion', 'Not in the dictionary'))
print(d.get('lion', 'NA'))
print(d.get('dog', 'NA'))

পাইথন ডিকশনারি সম্পর্কে আরও অন্বেষণ করুন এবং ইন্টারেক্টিভভাবে এখানে শিখুন ...


1

এই প্রশ্নের বহু উত্তর থাকা সত্ত্বেও খুব কম লোকই উপস্থিত রয়েছে, যেগুলি অভিধানের আন-অর্ডারযুক্ত ম্যাপিংগুলি নির্দেশ করে এবং তাই (পাইথন ৩.7 সহ সন্নিবেশকরণ আদেশের আশীর্বাদ না হওয়া পর্যন্ত) একটি অভিধানে আক্ষরিক অর্থে "প্রথম" প্রবেশের ধারণাটি কোন জ্ঞান নেই. এবং এমনকি কোনও OrderedDictকেবলমাত্র অনাগত ব্যবসায়ের সাহায্যে অঙ্ক সূচক দ্বারা অ্যাক্সেস করা যেতে পারে mydict[mydict.keys()[0]](পাইথন 2 কেবলমাত্র পাইথন 3 keys()এ একটি সাব-স্ক্রিপ্টযোগ্য পুনরুক্তিযোগ্য))

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

আইটেমগুলি নির্বাচন এবং "ফর্ম্যাটিং" করার প্রশ্নে, অভিধানে আপনি কীটি পুনরুদ্ধার করতে চান তা যদি আপনি জানেন তবে আপনি সাধারণত পুনরুদ্ধারের জন্য কীটি সাবস্ক্রিপ্ট হিসাবে ব্যবহার করবেন ( my_var = mydict['Apple'])।

আপনি যদি সত্যিই এন্ট্রি নম্বর দ্বারা আইটেমগুলি সূচী করতে সক্ষম হতে চান (সন্নিবেশগুলি তৈরি করার সাথে সাথে কোনও নির্দিষ্ট প্রবেশের নম্বরটি পরিবর্তিত হবে এই বিষয়টি উপেক্ষা করে) তবে উপযুক্ত কাঠামোটি সম্ভবত দ্বি-উপাদানগুলির তালিকার একটি তালিকা হবে। পরিবর্তে

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

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

mylist = [
    ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
    ('Grapes', {'Arabian': '25', 'Indian': '20'}
]

এই শাসনের অধীনে প্রথম এন্ট্রিটি mylist[0]ক্লাসিক তালিকা-শেষের আকারে রয়েছে এবং এর মান ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})। আপনি নিম্নলিখিত হিসাবে পুরো তালিকাটি পুনরাবৃত্তি করতে পারে:

for (key, value) in mylist:  # unpacks to avoid tuple indexing
    if key == 'Apple':
        if 'American' in value:
            print(value['American'])

তবে যদি আপনি জানেন যে আপনি কী "অ্যাপল" কীটি সন্ধান করছেন, তবে আপনি কেন কেবল তার পরিবর্তে ডিক ব্যবহার করবেন না?

কীগুলির তালিকাকে ক্যাশে করে আপনি অতিরিক্ত স্তরের ইন্ডিয়ারেশন পরিচয় করিয়ে দিতে পারেন, তবে দুটি ডাটা স্ট্রাকচারকে সিঙ্ক্রোনাইজেশনে রাখার জটিলতাগুলি অবশ্যম্ভাবীভাবে আপনার কোডের জটিলতায় যোগ করবে।


0

নিম্নলিখিত ছোট ফাংশন সহ, গাছ-আকৃতির অভিধানে খনন করা বেশ সহজ হয়ে যায়:

def dig(tree, path):
    for key in path.split("."):
        if isinstance(tree, dict) and tree.get(key):
            tree = tree[key]
        else:
            return None
    return tree

এখন, dig(mydict, "Apple.Mexican")ফিরে আসে 10, যখন dig(mydict, "Grape")সাবট্রি দেয় {'Arabian':'25','Indian':'20'}। অভিধানে কোনও কী না থাকলে, digফিরে আসে None

নোট করুন যে আপনি 'থেকে বিভাজক চরটি সহজেই (বা পরামিতিও) পরিবর্তন করতে পারেন' ' থেকে '/', '|' প্রভৃতি

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