पायथन में एक शब्दकोश में एक मनमाना तत्व तक पहुंचें


506

यदि एक mydict कोई खाली नहीं है, तो मैं एक मनमाना तत्व का उपयोग करता हूं:

mydict[mydict.keys()[0]]

क्या ऐसा करने का कोई बेहतर तरीका है?


3
उसने क्या कहा .. यह केवल एक वैध सवाल है अगर वहाँ केवल एक ही तत्व है, या आप परवाह नहीं करते हैं जो आपको वापस मिलता है।
शाही

5
हाँ, मुझे बस उस तत्व तक पहुँचने की ज़रूरत है जो तानाशाही में है, इसलिए मैं पहले तत्व तक पहुँचना चाहता हूँ।
स्टेन

2
@Stan: लेकिन जैसा कि ग्रेग ने कहा, तानाशाही में कोई "पहला" तत्व नहीं है। इसलिए शायद आपको अपना प्रश्न बदल देना चाहिए, बस स्पष्ट होना चाहिए
tdihp

10
मुझे लगता है कि यह एक वैध प्रश्न है। यदि आपको एक मनमानी तत्व तक पहुंचने की आवश्यकता है, और आप सुनिश्चित हैं कि तानाशाह खाली नहीं है, तो "पहले" के लिए पूछना एक अच्छा विचार हो सकता है, क्योंकि आइटम की संख्या ज्ञात नहीं हो सकती है।
kap

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

यदि आपको केवल एक तत्व का उपयोग करने की आवश्यकता है (संयोग से पहला होने के बाद से, जब से dicts आदेश देने की गारंटी नहीं देते हैं) आप केवल पायथन 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

कृपया ध्यान दें कि (मेरी जानकारी के अनुसार) पायथन इस बात की गारंटी नहीं देता है कि इनमें से किसी भी विधि के लिए 2 क्रमिक कॉल समान क्रम के साथ सूची में वापस आएंगे। यह पायथन 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
यह केवल Python 2.x में काम करता है, 3.x के लिए आपको उपयोग करना होगाlist(my_dict.keys())[0]
alldayremix

6
तो, यह किस जटिलता की श्रेणी है? निश्चित रूप से, list(my_dict.keys())[0]आलसी नहीं है?
इवगेनी सर्गेव

1
स्पष्ट करने के लिए, उस टिप्पणी के साथ @alldayremix का मतलब क्या है python 3.x my_dict.function () परिणाम अनुक्रमण का समर्थन नहीं करते हैं, यही कारण है कि सबसे पहले हमें इसे एक सूची में बदलना चाहिए और फिर हम सूचकांक का उपयोग कर सकते हैं [0]
नोकी

57

अजगर 3 में, जिस तरह से:

dict.keys() 

प्रकार में एक मान लौटाएँ: dict_keys (), हमें एक त्रुटि मिली जब इस तरह से तानाशाही की चाबियाँ के 1 सदस्य मिले:

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

अंत में, मैं @ 1 को सूचीबद्ध करने के लिए dict.keys () को परिवर्तित करता हूं, और सूची ब्याह विधि द्वारा 1 सदस्य मिला:

list(dict.keys())[0]

यह python2 और python3 दोनों में सबसे आसान उपाय और काम करता है।
मैटमिल्टन

मेरे पैसे के लिए। मैं कहता हूं कि यह उत्तर सबसे सहज है
थॉमस वाल्डेज़

हाँ, लेकिन यह ओपी प्रश्न का उत्तर नहीं देता है, जो कि कैसे वैल्यू में मिलता है, चाबियाँ नहीं।
माइक विलियमसन

1
@ मायक विलियम्सन को उम्मीद है कि अधिकांश पाठकों को पता होगा कि एक अजगर के हुक्म से एक चाबी दी गई इसी मूल्य को कैसे प्राप्त किया जा सकता है।
eric

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)]ऐसा करेगा। यदि आप उस क्रम की परवाह करते हैं जिसमें कुंजियाँ डाली गई थीं, अर्थात, "पहले" से आपका मतलब "जल्द से जल्द डाला गया" है, तो पायथन 3.1 में आप संग्रह का उपयोग कर सकते हैं। क्रमबद्ध करें , जो कि आगामी पायथन 2.7 में भी है; पाइथन के पुराने संस्करणों के लिए, ऑर्डर किए गए ताना-बाना (2.4 और बाद के) को डाउनलोड, इंस्टॉल, और उपयोग करें जो आप यहां पा सकते हैं ।

पायथन 3.7 अब डाइक्ट्स को आर्डर किया जाता है।


11

इस बारे में कैसा है। यहाँ अभी तक उल्लेख नहीं किया गया है।

py 2 और 3

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

5
dict.values()एक दृश्य देता है, इसलिए O (1) होना चाहिए। list(a)एक नई सूची देता है, इसलिए O (n) होगा।
ब्वॉयसी

यह भी ऐसा लगता है जैसे यह python2 में काम नहीं करता है अगर a = {"a": {"1"}}
qasimzee

11

आस-पास के आदेशों की उपेक्षा करना, यह बेहतर हो सकता है:

next(dict.itervalues())

इस तरह हम आइटम लुकअप से बचते हैं और उन कुंजियों की सूची बनाते हैं जिनका हम उपयोग नहीं करते हैं।

python3

next(iter(dict.values()))

2
मान () सभी मानों की एक प्रति बनाएगा (कुंजी के रूप में (कुंजी के लिए)), तो इससे कई ऑपरेशन O (n ^ 2) होंगे।
ग्लेन मेनार्ड

तो क्या ओपी संस्करण होगा? मैं इसे फिर एक पुनरावृत्ति का उपयोग करने के लिए बदल दूँगा।
मैट जॉइनर

4
यह केवल पायथन 2 है। पायथन 3 के लिए, हमें next(iter(dict.values()))सूची बनाए बिना एक ही परिणाम प्राप्त करने की आवश्यकता है।
kap


2

आप हमेशा ऐसा कर सकते हैं:

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

यह आपको एक निरंतर क्रमबद्धता देगा ( बिलिन के संबंध में आप अगर छंटाई आप के लिए किसी भी अर्थ नहीं है पर संसाधित कर सकते हैं चाबियों का () मुझे लगता है कि .hash) सेट। उदाहरण के लिए संख्यात्मक प्रकारों को लगातार क्रमबद्ध किया जाता है भले ही आप शब्दकोश का विस्तार करें।

उदाहरण

# 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 के साथ काम करने के लिए उत्तर को बेहतर बनाने के लिए कैसे किया गया है ), और "नया" उत्तर नहीं, जैसे कि। SO की समीक्षा प्रणाली ने स्वचालित रूप से इस मामले में कुछ हद तक
अप्रभावी

नहीं साहब। आपने इस वेरिएंट को अपने 5 यो उत्तर में सिर्फ 17 घंटे पहले जोड़ा, उसके 1 घंटे बाद मैंने यह उत्तर लिखा। इस पृष्ठ पर 'छह' शब्द के लिए 'खोजने' का उपयोग करने का प्रयास करें और आपको केवल 6 मैच केवल इन 2 उत्तरों में मिलेंगे। वैसे भी, क्या यह जवाब वास्तव में आपको परेशान करता है? मुझे लगता है कि यह भविष्य में अन्य लोगों की मदद कर सकता है और यह ठीक है। तो, सौदा क्या है?
ओबेलक्स

ऐसा इसलिए क्योंकि IMHO इस उत्तर को पहली बार उस पोस्ट के लिए संपादित किया जाना चाहिए था। संपादन के बिना, लोगों को आपके उत्तर को देखने के लिए कई पृष्ठों को नीचे स्क्रॉल करना होगा; क्या आपको लगता है कि अत्यधिक उत्क्रमित उत्तर की तुलना में यह अधिक उपयोगी है जो लगभग आपके जैसा ही है?
मार्टिन टूरनोइज

0
first_key, *rest_keys = mydict

11
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया अपने स्पष्टीकरण को संपादित करने के लिए कुछ स्पष्टीकरण जोड़ने के लिए, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
सूरज राव

-1

कोई बाहरी पुस्तकालय नहीं, दोनों पायथन 2.7 और 3.x पर काम करता है:

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

अयोग्य कुंजी के लिए बस बाहर छोड़ दें।

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

-2

उपवर्ग dictएक विधि है, हालांकि कुशल नहीं है। यदि आप पूर्णांक की आपूर्ति करते हैं तो यह वापस आ जाएगी 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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.