आप एक शब्दकोश में पहली कुंजी कैसे खोजते हैं?


201

मैं अपने कार्यक्रम को "banana"शब्दकोश से प्रिंट करने की कोशिश कर रहा हूं । ऐसा करने का सबसे सरल तरीका क्या होगा?

यह मेरा शब्दकोश है:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
पाइथन में शब्दकोश अनियंत्रित हैं, इसलिए कोई "पहली कुंजी नहीं है।" यहां देखें
डेविड रॉबिन्सन

2
क्या आप शाब्दिक रूप से "केला" शब्द या "केला" (4, इस मामले में) से जुड़े मूल्य को प्रिंट करना चाहते हैं?
पॉल एच।

to print out banana with a FOR loop, so when I run it, each key would also be printed outक्या आपका मतलब है for k in prices: print k? यह शब्दकोश में सभी कुंजी को प्रिंट करेगा।
डेविड रॉबिन्सन


8
पहली टिप्पणी में: अजगर 3.6+ शब्दकोशों में आदेश दिया गया (देखें stackoverflow.com/questions/39980323/… )
एगिरस ओरनिला

जवाबों:


286

एक पायथन संस्करण पर जहां डाइक्स वास्तव में ऑर्डर किए जाते हैं, आप कर सकते हैं

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

आदेश दिए जाने के लिए, आपको Python 3.7+ या 3.6+ की आवश्यकता है, यदि आप Python 3.6 पर तकनीकी रूप से एक-कार्यान्वयन-विस्तार के आदेश दिए गए प्रकृति पर निर्भर होने के साथ ठीक हैं।

पहले पायथन संस्करणों के लिए, कोई "पहली कुंजी" नहीं है।


30
यदि आप अजगर 3 में कुंजी और मूल्य दोनों चाहते हैं:next(iter( my_dict.items() ))
जोनाथन एच।

@ रियानिंग पायथन डक्ट्स को सीपीथॉन 3.6 के साथ शुरू होने वाले सम्मिलन द्वारा आदेश दिया गया है और किसी भी अन्य पायथन कार्यान्वयन की शुरुआत पायथॉन 3.7
बोरिस

1
इस उत्तर ने मेरे डिबगिंग सत्र को खराब कर दिया, जिसका मुझे ब्रेकपॉइंट पर पहुंचने के लिए 6 घंटे इंतजार करना पड़ा। यह बहुत ही अश्लील है।
माइकल

128

एक शब्दकोश अनुक्रमित नहीं है, लेकिन यह किसी तरह से, आदेश दिया गया है। निम्नलिखित आपको पहली मौजूदा कुंजी देगा:

list(my_dict.keys())[0]

25
क्या यह आसान नहीं होगा list(my_dict)[0]क्योंकि यह वैसे भी चाबियों की सूची को पुनः प्राप्त करेगा?
जीन-फ्रेंकोइस टी।

@ जीन FrancoisT। हाँ
रयान हेनिंग

शब्द अब CPython 3.6 और अन्य सभी पायथन क्रियान्वयनों में Python 3.7
बोरिस

53

अद्यतन: पायथन 3.7 के रूप में, प्रविष्टि क्रम बनाए रखा जाता है, इसलिए आपको OrderedDictयहां की आवश्यकता नहीं है। आप एक सामान्य के साथ नीचे के दृष्टिकोण का उपयोग कर सकते हैंdict

संस्करण 3.7 में परिवर्तित: शब्दकोश आदेश प्रविष्टि आदेश होने की गारंटी है। यह व्यवहार 3.6 से CPython का कार्यान्वयन विवरण था।

स्रोत


अजगर 3.6 और पहले *

यदि आप एक नियमित के बारे में बात कर रहे हैं dict, तो "पहली कुंजी" का कोई मतलब नहीं है। चाबियाँ किसी भी तरह से आप पर निर्भर कर सकते हैं आदेश नहीं हैं। यदि आप अपने ऊपर पुनरावृत्ति करते dictहैं, तो संभवतः आपको "banana"वह पहली चीज़ नहीं मिलेगी जो आप देखते हैं।

यदि आपको चीजों को क्रम में रखने की आवश्यकता है, तो आपको एक का उपयोग करना होगा, OrderedDictन कि केवल एक सादे शब्दकोश।

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

आप तो सभी कुंजियों देखना चाहता था तो क्रम में आप के माध्यम से यह पुनरावृत्ति कर ऐसा कर सकता है

for k in prices:
    print(k)

आप वैकल्पिक रूप से सभी कुंजियों को एक सूची में रख सकते हैं और फिर उसी के साथ काम कर सकते हैं

ks = list(prices)
print(ks[0]) # will print "banana"

सूची बनाने के बिना पहला तत्व प्राप्त करने का एक तेज़ तरीका nextइट्रेटर पर कॉल करना होगा । nthहालांकि तत्व प्राप्त करने की कोशिश करते समय यह अच्छी तरह से सामान्य नहीं करता है

>>> next(iter(prices))
'banana'

* सीपीथॉन ने 3.6 में कार्यान्वयन विवरण के रूप में सम्मिलन आदेश की गारंटी दी थी।


सलाह के लिए धन्यवाद। अधिक स्पष्ट नहीं होने के लिए मुझे खेद है। मैं सिर्फ उस कोड को ढूंढने की कोशिश कर रहा हूं जो मुझे "केला" प्रिंट करने देगा, जो इससे जुड़ा मूल्य नहीं है। सभी इनपुट के लिए आपको धन्यवाद!
स्लैगॉय

31

नीचे पायथन 3 के लिए सूची रूपांतरण के ओवरहेड को समाप्त करता है:

first = next(iter(prices.values()))

10

dictप्रकार एक है अव्यवस्थित मानचित्रण, तो एक "प्रथम" तत्व के रूप में ऐसी कोई बात नहीं है।

आप जो चाहते हैं वह शायद है collections.OrderedDict


या एक नामांकित व्यक्ति शायद अगर यह अपरिवर्तनीय है
जोरन बेस्ले

यह पायथन 3.6 के रूप में बदल गया है। अब शब्दकोश का आदेश दिया गया है।
misantroop

1
अच्छी तरह से तकनीकी रूप से, आप शब्दकोश कुंजी का पहला तत्व चाहते हैं यदि आप निश्चित हैं, तो केवल एक कुंजी है।
DBX12

एक तयशुदा से अधिक पुनरावृत्ति करते हुए पहला आइटम कह सकता है जो कि तय हो गया है। लेकिन अच्छी किस्मत यह है कि एक बाहर।
डेमॉन्गोलम

6

इसलिए मुझे यह पेज ज्ञात लंबाई 1 के शब्दकोश में एकमात्र कुंजी लेने और केवल कुंजी वापस करने के लिए एक चीज़ को अनुकूलित करने की कोशिश करते हुए मिला। नीचे दी गई प्रक्रिया उन सभी शब्दकोशों के लिए सबसे तेज़ थी, जिनकी मैंने 700 तक की कोशिश की थी।

मैंने 7 अलग-अलग तरीकों की कोशिश की, और पाया कि यह सबसे अच्छा मेरी 2014 की मैकबुक पर पायथन 3.6 के साथ था:

def first_5():
    for key in biased_dict:
        return key

उन्हें प्रोफाइल करने के परिणाम थे:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

मेरे द्वारा आजमाए गए सभी दृष्टिकोण:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
तो लूप के लिए करना और पहली कुंजी (first_5) वापस करना वास्तव में सबसे तेज़ है जैसा कि मैं देख सकता हूं? विभिन्न दृष्टिकोणों की एक अच्छी तुलना भी।
PiMathCLanguage

1
हाँ, और न केवल सबसे तेज, बल्कि एक देश मील द्वारा सबसे तेज। पढ़ने में भी आसान, सुविधाजनक।
तुरियाग

4

खैर जितना आसान होगा, मेरे हिसाब से उतना ही जवाब होगा

first = list(prices)[0]

डिक्शनरी को डिक्शनरी में कनवर्ट करने से चाबियां तैयार होंगी और हम लिस्ट में से पहली की को चुनेंगे।


Python3 के लिए, केवल अपने पहले तत्व को पुनः प्राप्त करने के लिए एक पूरी नई सूची बनाने की आवश्यकता नहीं है। बेहतर उपयोग next(iter(prices)), जैसा कि पहले से ही अन्य उत्तरों द्वारा सुझाया गया है।
मानदंड

1

जैसा कि कई अन्य लोगों ने बताया है कि एक शब्दकोश में कोई पहला मूल्य नहीं है। उनमें छंटाई मनमानी है और आप हर बार जब आप शब्दकोश तक पहुँचते हैं तो छँटाई को एक ही तरह से नहीं गिना जा सकता। हालाँकि अगर आप वहाँ कीज़ को प्रिंट करना चाहते हैं तो इसके कुछ तरीके हैं:

for key, value in prices.items():
    print(key)

यह विधि कुंजी और मान तक पहुंचने के लिए टपल असाइनमेंट का उपयोग करती है। यह आसान है अगर आपको किसी कारण से कुंजी और मूल्य दोनों का उपयोग करने की आवश्यकता है।

for key in prices.keys():
    print(key)

जैसा कि keys()विधि का अर्थ है यह केवल कुंजियों तक पहुंच प्रदान करेगा ।


1

d.keys () [को ०] व्यक्तिगत कुंजी प्राप्त करने के लिए।

अपडेट: - @ एलेजोबरनार्डिन, मुझे यकीन नहीं है कि आपने क्यों कहा कि यह काम नहीं करता है। यहाँ मैंने जाँच की और यह काम कर गया। आयात संग्रह

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'केला'


वोटों की संख्या से जाना, यह सबसे अच्छा समाधान क्यों नहीं है?
गुस्कु

18
यह python2 में काम करता है लेकिन python3 में नहीं। Python3 में, के बजाय dict.keys()एक रिटर्न देता है , जो अनुक्रमण का समर्थन नहीं करता है। 'dict_keys' objectlist
मविक्स

TypeError: 'dict_keys' ऑब्जेक्ट इंडेक्सिंग का समर्थन नहीं करता है
anilbey

0

एक लूप के लिए उपयोग करें जो सभी कुंजियों के माध्यम से होता है prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

सुनिश्चित करें कि यदि आप पायथन 2.x का उपयोग कर रहे हैं, तो आप इसे बदल prices.items()देंprices.iteritems()


0

यदि आप सिर्फ एक शब्दकोश से पहली कुंजी चाहते हैं, तो आपको पहले जो सुझाव दिए गए हैं, उनका उपयोग करना चाहिए

first = next(iter(prices))

हालाँकि, यदि आप पहले चाहते हैं और बाकी को एक सूची के रूप में रखते हैं तो आप अनपैकिंग ऑपरेटर के मूल्यों का उपयोग कर सकते हैं

first, *rest = prices

यह मानों पर लागू होता है और कुंजी और मूल्य दोनों के pricesसाथ बदलकर prices.values()आप अनपैकिंग असाइनमेंट का उपयोग भी कर सकते हैं

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

नोट: आपको first, *_ = pricesकेवल पहली कुंजी प्राप्त करने के लिए उपयोग करने के लिए लुभाया जा सकता है , लेकिन मैं आमतौर पर इस उपयोग के खिलाफ सलाह दूंगा जब तक कि यह शब्द बहुत ही छोटा नहीं है क्योंकि यह सभी कुंजियों पर लूप करता है और restकुछ ओवरहेड के लिए एक सूची बनाता है।

नोट: जैसा कि दूसरों ने उल्लेख किया है कि सम्मिलन आदेश अजगर 3.7 (या तकनीकी रूप से 3.6) और उससे ऊपर से संरक्षित है जबकि पहले के कार्यान्वयन को अपरिभाषित आदेश माना जाना चाहिए।


-3

सबसे आसान तरीका है:

first_key = my_dict.keys()[0]

लेकिन कुछ बार आपको अधिक सावधान रहना चाहिए और आश्वस्त करना चाहिए कि आपकी इकाई एक मूल्यवान सूची है:

first_key = list(my_dict.keys())[0]

3
यह उठता है TypeError: 'dict_keys' object is not subscriptable, कम से कम पायथन 3.8 के साथ
एरिक स्वेन प्यूडिस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.