পাইথনের একটি অভিধানে একটি স্বেচ্ছাসেবী উপাদান অ্যাক্সেস করুন


506

যদি কোনও mydictশূন্য না থাকে, তবে আমি একটি স্বেচ্ছাসেবী উপাদানটি অ্যাক্সেস করি:

mydict[mydict.keys()[0]]

এটি করার আরও ভাল উপায় আছে কি?


3
তিনি যা বলেছিলেন .. ডিকটিতে কেবলমাত্র একটি উপাদান থাকলে এটি কেবল সত্যই বৈধ প্রশ্ন, বা আপনি কী ফিরে পাবেন সেদিকে খেয়াল রাখেন না।
রয়েল

5
হ্যাঁ, আমাকে কেবল ডিকের যে কোনও উপাদানটিতে অ্যাক্সেস করতে হবে, তাই আমি প্রথম উপাদানটিতে অ্যাক্সেস করতে চাই।
স্টান

2
@ স্ট্যান: তবে গ্রেগ যেমন বলেছিলেন, ডিকের কোনও নির্দিষ্ট "প্রথম" উপাদান নেই। তাই সম্ভবত আপনার প্রশ্নটি পরিবর্তন করা উচিত, কেবল পরিষ্কার হতে
tdishp

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

7
@MichaelScheper আপনি তালিকা কাস্ট করতে আছে: list(mydict.keys())[0]
ড্যানিয়েল মস্কোভিচ

উত্তর:


600

পাইথন 3-এ, ধ্বংসাত্মক এবং পুনরুক্তি:

next(iter(mydict.values()))

পাইথন 2 এ, ধ্বংসাত্মক এবং পুনরুক্তি:

mydict.itervalues().next()

যদি আপনি এটি পাইথন 2 এবং 3 উভয় ক্ষেত্রেই কাজ করতে চান তবে আপনি sixপ্যাকেজটি ব্যবহার করতে পারেন :

six.next(six.itervalues(mydict))

যদিও এই মুহুর্তে এটি বেশ রহস্যজনক এবং আমি বরং আপনার কোডটি পছন্দ করব।

আপনি যদি কোনও আইটেম সরাতে চান তবে করুন:

key, value = mydict.popitem()

নোট করুন যে "প্রথম" এখানে উপযুক্ত শব্দ হতে পারে না কারণ dictপাইথন <3.6 এ কোনও অর্ডারযুক্ত প্রকার নয়। পাইথন 3.6+ অর্ডার করা dictsহয়।


35
মানে না dict.iterkeys().next()?
জন মাচিন

12
@ জন মাচিন: ঠিক আছে, প্রশ্নটি প্রথম কীটির সাথে সম্পর্কিত মানটি অ্যাক্সেস করে বলে মনে হচ্ছে, তাই উত্তরে আমিও তাই করি।
দ্বিগুণ করুন

5
এটি আরও ভাল দেখাচ্ছে: dict.values().__iter__().__next__():)
ভাইটালি জাদানেভিচ

17
এটি বিরক্তিকর যে ডিক.কিজ () সরাসরি পুনরাবৃত্ত হয় না।
সেমিওমেন্ট

3
অ-ধ্বংসাত্মক পপাইটেমের জন্য আপনি একটি (অগভীর) অনুলিপি তৈরি করতে পারেন:key, value = dict(d).popitem()
পেল

139

আপনার যদি কেবলমাত্র একটি উপাদান অ্যাক্সেস করার প্রয়োজন হয় (সুযোগ অনুসারে প্রথম হওয়ায় ডিক্টস অর্ডার দেওয়ার নিশ্চয়তা দেয় না) আপনি পাইথন 2 এ কেবল এটি করতে পারেন :

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

দয়া করে নোট করুন (আমার জ্ঞানের সর্বোপরি) পাইথন গ্যারান্টি দেয় না যে এই পদ্ধতিগুলির যে কোনও একটির পর পর দুটি কল একই ক্রম দিয়ে তালিকাটি ফিরে আসবে। এটি পাইথন 3 সহ সমর্থিত নয়।

মধ্যে পাইথন 3 :

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element

90
এটি কেবল পাইথন ২.x এ কাজ করে, ৩.x এর জন্য আপনাকে ব্যবহার করতে হবেlist(my_dict.keys())[0]
alldayremix

6
সুতরাং, এটি কোন জটিলতা শ্রেণি? নিশ্চয়ই, list(my_dict.keys())[0]অলস নয়?
এভেজেনি সার্জিভ

1
পরিষ্কার করার জন্য, @ এল্ডায়রেমিক্স সেই মন্তব্যের সাথে কী বোঝাতে চেয়েছিল তা পাইথন ৩.x মাই_ডিক্ট.ফাংশন () ফলাফলগুলি ইনডেক্সিংকে সমর্থন করে না, এজন্য প্রথমে আমাদের অবশ্যই এটি একটি তালিকায় রূপান্তর করতে হবে এবং তারপরে আমরা সূচকটি ব্যবহার করতে পারি [0]
নকি

57

পাইথন 3 এ, উপায়:

dict.keys() 

প্রকারভেদে একটি মান ফেরত দিন: ডিক_কিজ (), ডিকের কীগুলির প্রথম সদস্য পেলাম তখন আমরা ত্রুটি পেয়ে যাব:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

অবশেষে, আমি ডট.কেজ () কে @ 1 ম তালিকায় রূপান্তরিত করেছি, এবং তালিকা বিভাজন পদ্ধতিতে 1 ম সদস্য পেয়েছি:

list(dict.keys())[0]

এটি সবচেয়ে সহজ সমাধান এবং পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রেই কাজ করে।
mattmilten

আমার টাকার জন্য। আমি বলছি এই উত্তরটি সবচেয়ে স্বজ্ঞাত
টমাস ভ্যালাদেজ

হ্যাঁ, তবে এটি ওপি প্রশ্নের উত্তর দেয় না, কীগুলি কী কী নয়, ভ্যালুয়াসে কীভাবে পাবেন।
মাইক উইলিয়ামসন

1
@ মাইকউইলিয়ামসন আশা করি বেশিরভাগ পাঠক অজগর ডিক থেকে কী কীভাবে দেওয়া হবে তা কীভাবে পাবেন তা জেনে আসবেন।
এরিক

5
একটি স্বেচ্ছাসেবক কী না হয়ে একটি স্বেচ্ছাসেবক আইটেম পেতে, আপনি অ্যানালগালিভাবে করতে পারেন list(dict.values())[0]
জ্বিন

24

একটি চাবি পেতে

next(iter(mydict))

একটি মান পেতে

next(iter(mydict.values()))

উভয় পেতে

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

প্রথম দুটি পাইথন 2 এবং 3। শেষ দুটি পাইথন 3 এ অলস, তবে পাইথন 2 এ নয়।


16

অন্যরা যেমন উল্লেখ করেছে, কোনও "প্রথম আইটেম" নেই, যেহেতু অভিধানগুলির কোনও গ্যারান্টিযুক্ত অর্ডার নেই (সেগুলি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়)। আপনি যদি উদাহরণস্বরূপ চান, তবে সবচেয়ে ছোট কীটির সাথে মানটি এটি thedict[min(thedict)]করবে। যদি আপনি কীগুলি কীভাবে সন্নিবেশ করা হয়েছিল সেটির বিষয়ে উদ্বিগ্ন হন, অর্থাত্ "প্রথম" দ্বারা আপনার বোঝানো হয়েছে "earোকানো শীঘ্রতম", তারপরে পাইথন ৩.১ এ আপনি সংগ্রহগুলি ব্যবহার করতে পারেন rআরআর্টডিক্ট , যা আগত পাইথন ২.7 এও রয়েছে; পাইথনের পুরানো সংস্করণগুলির জন্য ডাউনলোড করুন, ইনস্টল করুন এবং আদেশযুক্ত ডিক ব্যাকপোর্ট (২.৪ এবং তারপরে) ব্যবহার করুন যা আপনি এখানে খুঁজে পেতে পারেন ।

পাইথন ৩.7 এখন ডিক্টগুলি সন্নিবেশয়ের আদেশ দেওয়া হয়েছে।


11

কেমন, এই। এখনও এখানে উল্লেখ করা হয়নি।

পাই 2 এবং 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

5
dict.values()একটি দর্শন দেয়, সুতরাং ও (1) হওয়া উচিত। list(a)একটি নতুন তালিকা প্রদান করে, সুতরাং ও (এন) হবে।
বালক

এছাড়াও এটি দেখে মনে হচ্ছে এটি পাইথন 2 তে কাজ করে না যদি a = {"a": {"1"}}
কাসিমজি

11

ডিক অর্ডার দেওয়ার আশেপাশের সমস্যাগুলি উপেক্ষা করা, এটি আরও ভাল হতে পারে:

next(dict.itervalues())

এইভাবে আমরা আইটেম অনুসন্ধান এবং আমাদের ব্যবহার না করে এমন কীগুলির একটি তালিকা তৈরি করা এড়ানো।

Python3

next(iter(dict.values()))

2
মান () সমস্ত মানের একটি অনুলিপি তৈরি করে (কীগুলির জন্য কী হিসাবে) (যেমন হবে), সুতরাং এটি অনেকগুলি ক্রিয়াকলাপকে O (n ^ 2) করবে।
গ্লেন মেইনার্ড

তাহলে ওপিএস সংস্করণটি হবে? আমি এটির পুনরুক্তি ব্যবহার করতে এটি পরিবর্তন করব।
ম্যাট জেন্ডার

4
এটি কেবল পাইথন ২। পাইথন 3 এর জন্য, next(iter(dict.values()))তালিকা তৈরি না করে আমাদের একই ফল পাওয়া দরকার ।
কেপ


2

আপনি সর্বদা করতে পারেন:

for k in sorted(d.keys()):
    print d[k]

এটি হয়ত আপনাকে ধারাবাহিকভাবে (সম্মান সঙ্গে সাজানো দেব builtin যদি আপনি শ্রেণীবিভাজন আপনাকে কোন অর্থ আছে উপর প্রক্রিয়া করতে পারি কি () আমি .hash) সেট। এর অর্থ উদাহরণস্বরূপ সংখ্যাটি প্রকারগুলি ধারাবাহিকভাবে বাছাই করা হয় এমনকি আপনি অভিধানটি প্রসারিত করলেও।

EXAMPLE টি

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

নোট করুন যে অভিধানটি প্রিন্ট করার সময় বাছাই করা আছে। তবে কী সেটটি মূলত হ্যাশম্যাপ!


2

পাইথন 2 এবং 3 উভয়ের জন্য:

import six

six.next(six.itervalues(d))

এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন।
মার্টিন টর্নোইজ

এটি হ'ল Is there any better way to do this?সংক্ষিপ্ত পদ্ধতিতে প্রশ্নের উত্তর দেয় ।
ওবল্লেক্স

এই উত্তরটি ইতিমধ্যে দু'বার দেওয়া হয়েছে যার মধ্যে একটি প্রায় 5 বছর ধরে এই সাইটে রয়েছে। এটি অন্য উত্তরের একটি মন্তব্য (যেমন: পাইথন 2 এবং 3 উভয়কেই কাজটি করার জন্য উত্তরটি কীভাবে উন্নত করা যায় তা এখানে ), এবং "নতুন" উত্তর নয়। এসও এর পর্যালোচনা সিস্টেম স্বয়ংক্রিয়ভাবে এই ক্ষেত্রে কিছুটা
অস্বাস্থ্যকর

না জনাব. আমি এই উত্তরটি লেখার ঠিক ১ ঘন্টা পরে আপনি ১ 17 ঘন্টা আগে আপনার 5 টি উত্তরের সাথে এই রূপটি যুক্ত করেছেন। এই পৃষ্ঠায় 'ছয়' শব্দের জন্য 'সন্ধান করুন' ব্যবহার করার চেষ্টা করুন এবং আপনি কেবল এই 2 টি উত্তরে 6 টি মিল খুঁজে পাবেন। যাইহোক, এই উত্তর কি সত্যিই আপনাকে বিরক্ত করে? আমি মনে করি এটি ভবিষ্যতে অন্যান্য ব্যক্তিকে সহায়তা করতে পারে এবং এটি ঠিক আছে। তো, চুক্তি কী?
ওব্ল্লেক্স

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

0
first_key, *rest_keys = mydict

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

-1

বাইরের কোনও লাইব্রেরি নেই, পাইথন ২.7 এবং ৩.x উভয় ক্ষেত্রেই কাজ করে:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

অ্যাব্রিট্রি কী এর জন্য কেবল মূল্যবোধগুলি ছাড়ুন)

>>> list(set({"a":1, "b": 2}))[0]
'a'

-2

সাবক্লাসিং dictএকটি পদ্ধতি, দক্ষ না হলেও though এখানে আপনি যদি পূর্ণসংখ্যার সরবরাহ করেন তবে তা ফিরে আসবে d[list(d)[n]], অন্যথায় প্রত্যাশার মতো অভিধানটি অ্যাক্সেস করুন:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.