পাইথন 3 এ সূচি দ্বারা ডিক_কিজ উপাদানটি অ্যাক্সেস করা হচ্ছে


131

আমি ডেক্স_কি এর উপাদানটিকে এর সূচক দ্বারা অ্যাক্সেস করার চেষ্টা করছি:

test = {'foo': 'bar', 'hello': 'world'}
keys = test.keys()  # dict_keys object

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'

আমি পেতে চাই foo

একই সাথে:

keys[0]
TypeError: 'dict_keys' object does not support indexing

কিভাবে আমি এটি করতে পারব?


9
পাই 3.এক্সে dict.keys()ভিউ অবজেক্টের মতো সেট দেয়, তালিকা নয় (সুতরাং, সূচীকরণ সম্ভব নয়)। ব্যবহারkeys = list(test)
অশ্বিনী চৌধুরী চৌধুরী

যখন আমি তালিকা (কিছু_ডিক্ট) করি, তখন টিউপল ক্রমটি এলোমেলো: উদাহরণ: তালিকা ({'foo': 'বার', 'হ্যালো': 'বিশ্ব'}) ফিরে আসতে পারে: তালিকা (ফু, হ্যালো) বা তালিকা (হ্যালো, ফু), এলোমেলো কেন?
fj123x

7
Dicts কোনো আদেশ না (ব্যবহার করুন। collections.OrderedDictযদি আপনি আদেশ কী চান)
অশ্বিনী চৌধুরীর

থ্রেড সুরক্ষার জন্য আকর্ষণীয় আলোচনা এখানে এই সমস্যাটি সমাধানের জন্য বিভিন্ন পদ্ধতির পুনরায় সমন্বিত করে: blog.labix.org/2008/06/27/…
পল

উত্তর:


161

list()পরিবর্তে অভিধানে কল করুন:

keys = list(test)

পাইথন 3-এ, dict.keys()পদ্ধতিটি একটি অভিধান ভিউ অবজেক্ট প্রদান করে , যা একটি সেট হিসাবে কাজ করে। অভিধানের উপরে আইট্রেট করা সরাসরি কীগুলিও দেয়, সুতরাং একটি অভিধানকে তালিকায় পরিণত করে সমস্ত কীগুলির তালিকার ফলাফল:

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'

3
পাইথন 3-এ তালিকার জন্য (ডক্ট.কিজ ()) দেখুন - ল্যাবিক্স ব্লগ কোনও সমাধান না দিয়ে সমস্যাটি কী তা স্পষ্টভাবে ব্যাখ্যা করে। এটি দুর্দান্ত!
ব্র্যান্ডন ব্র্যাডলি

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

@ ব্র্যান্ডন ব্র্যাডলি: লিঙ্কটির জন্য ধন্যবাদ। পাইথন 3-তে আমার জন্য ব্লগের মন্তব্যগুলির মধ্যে একটির সমাধান কেবল সমাধান করেছে: সাজানো (ডিক্ট.কিজ ())। পাইথন 2-এ, ডটক.কিজ () মূল মানগুলির একটি তালিকা ফিরিয়ে দেবে।
গুড উইল

2
@ গুডউইল: sorted(dict)ঠিক একই কাজ করবে; বাছাই করা ক্রমে কীগুলির একটি তালিকা তৈরি করুন। list(dict)অভিধানের ক্রমে আপনাকে তালিকাটি দেবে।
মার্টিজন পিটারস

1
বা ব্যবহার করতে পারেনkeys = [*test]
Alex78191

59

পুরো উত্তর নয় তবে সম্ভবত একটি কার্যকর ইঙ্গিত। যদি এটি সত্যিই প্রথম আইটেম হয় তবে আপনি * চান

next(iter(q))

তুলনায় অনেক দ্রুত

list(q)[0]

বড় dicts জন্য, যেহেতু পুরো জিনিস স্মৃতিতে সংরক্ষণ করা হয় না।

10.000.000 আইটেমের জন্য আমি এটি প্রায় 40.000 গুণ দ্রুত গতিতে পেয়েছি।

* পাইথন ৩.6 এর আগে ডিকের ক্ষেত্রে প্রথম আইটেমটি কেবলমাত্র ছদ্ম-এলোমেলো আইটেম (তার পরে এটি স্ট্যান্ডার্ড বাস্তবায়নের আদেশ দেওয়া হয়েছে, যদিও এটির উপর নির্ভর করার পরামর্শ দেওয়া হয়নি)।


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

2

আমি প্রথম অভিধান আইটেমটির "কী" এবং "মান" জোড়া চাইছিলাম। আমি নিম্নলিখিত কোড ব্যবহার করেছি।

 key, val = next(iter(my_dict.items()))

0
test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

একটি স্ট্যাটিক্যালি সংজ্ঞায়িত তালিকায় কীগুলি সংযোজন এবং তারপরে এটির জন্য সূচিবদ্ধ করার প্রচলিত উপায়


2
এটা ভুল নয়, তবে কেন নয় ls = list(test.keys())? আমি এটি আরও সহজ মনে।
ভ্যালেন্টিনো

হ্যাঁ, এটি আরও দক্ষ। আমি কেবল পাঠযোগ্যতা প্রদর্শনের জন্য এটি লিখেছিলাম wrote
প্রণব দুয়া

0

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

আমি পাইথন 3 তে কিছু পাইথন 2 কোডটি অনুবাদ করেছি:

keys = d.keys()
for (i, res) in enumerate(some_list):
    k = keys[i]
    # ...

যা সুন্দর নয়, তবে খুব খারাপও নয়। প্রথমদিকে, আমি এটি সন্ন্যাসী দ্বারা প্রতিস্থাপন করতে চলেছিলাম

    k = next(itertools.islice(iter(keys), i, None))

আমি বুঝতে পারার আগে এটি আরও ভাল হিসাবে লেখা হয়

for (k, res) in zip(d.keys(), some_list):

যা ঠিক কাজ করে।

আমি বিশ্বাস করি যে অন্যান্য অনেক ক্ষেত্রে, অবস্থান অনুসারে অভিধান কীগুলি ইনডেক্স করা যায়। যদিও পাইথনে ৩.7-তে অভিধান অর্ডার করা হয়েছে তবে এর উপর নির্ভর করা খুব সুন্দর নয়। উপরের কোডটি কেবলমাত্র কাজ করে কারণ এর সামগ্রীগুলি some_listসম্প্রতি প্রযোজ্য ছিল d

আপনার কোডটি যদি সত্যই disk_keysসূচক অনুসারে কোনও উপাদান অ্যাক্সেস করার প্রয়োজন হয় তবে আপনার কড়া নজর দিন । সম্ভবত আপনার দরকার নেই।


0

এটা চেষ্টা কর

keys = [next(iter(x.keys())) for x in test]
print(list(keys))

ফলাফলটি এরকম দেখাচ্ছে। ['ফু', 'হ্যালো']

আপনি এখানে আরও সম্ভাব্য সমাধানগুলি খুঁজে পেতে পারেন ।

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