पायथन में सूची के रूप में शब्दकोश कुंजियाँ कैसे लौटाएँ?


777

में अजगर 2.7 , मैं शब्दकोश मिल सकता है कुंजी , मूल्यों , या आइटम एक सूची के रूप में:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

अब, पायथन> = 3.3 में , मुझे ऐसा कुछ मिलता है:

>>> newdict.keys()
dict_keys([1, 2, 3])

इसलिए, मुझे एक सूची प्राप्त करने के लिए ऐसा करना होगा:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

मैं सोच रहा था, क्या पायथन 3 में एक सूची वापस करने का एक बेहतर तरीका है ?


इस विषय के बारे में दिलचस्प थ्रेड सुरक्षा मुद्दा यहाँ है: blog.labix.org/2008/06/27/…
पॉल

2
मैं पायथन के लिए नया हूं, और मुझे ऐसा लगता है कि बेकार नए डेटाटिप्स का यह प्रसार अजगर के सबसे बुरे पहलुओं में से एक है। किस प्रयोग से यह डिक्टेट_कीटा डेटेटाइप है? सूची क्यों नहीं?
फिल गोएट्ज

जवाबों:


974

कोशिश करो list(newdict.keys())

यह dict_keysऑब्जेक्ट को एक सूची में बदल देगा ।

दूसरी ओर, आपको खुद से पूछना चाहिए कि क्या यह मायने रखता है या नहीं। कोड के लिए पाइथोनिक तरीका बतख टाइपिंग मान रहा है ( यदि यह बतख की तरह दिखता है और यह बतख की तरह फट जाता है , तो यह बतख है )। dict_keysवस्तु सबसे प्रयोजनों के लिए एक सूची की तरह कार्य करेगा। उदाहरण के लिए:

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

जाहिर है, प्रविष्टि ऑपरेटर काम नहीं कर सकते हैं, लेकिन यह भी शब्दकोश कुंजी की एक सूची के लिए बहुत मतलब नहीं है।


49
newdict.keys () इंडेक्सिंग का समर्थन नहीं करता है
gypaetus

57
list(newdict)यह भी काम करता है (कम से कम अजगर 3.4 में)। क्या .keys()विधि का उपयोग करने का कोई कारण है ?
n

46
नोट: डीबगर में pdb> list(newdict.keys()) विफल रहता है क्योंकि यह उसी नाम के pdb कमांड के साथ टकराता है। pdb> !list(newdict.keys())Pdb कमांड से बचने के लिए उपयोग करें ।
रियाज़ रिज़वी

23
@ naught101 हां, .keys()जो चल रहा है उस पर अधिक स्पष्ट है।
फेलिक्स डी।

2
ध्यान दें कि यदि आप सूची (newdict.keys ()) का उपयोग करते हैं, तो चाबी हैशिंग क्रम के कारण आपके द्वारा रखी गई क्रम में नहीं है!
नैट एम

274

पायथन> = 3.5 विकल्प: सूची शाब्दिक में अनपैक करें [*newdict]

नए अनपैकिंग सामान्यीकरण (PEP 448) पायथन 3.5 के साथ पेश किए गए थे, जिससे आप आसानी से कर सकते हैं:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

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

जोड़ा जा रहा है .keys()यानी [*newdict.keys()]अपने इरादे में थोड़ा और अधिक स्पष्ट है, हालांकि यह आप एक समारोह लुक-अप और मंगलाचरण खर्च होंगे बनाने में मदद कर सकता है। (जो, सभी ईमानदारी में, कुछ ऐसा नहीं है जिसके बारे में आपको वास्तव में चिंतित होना चाहिए )।

*iterableवाक्य रचना कर के समान है list(iterable)और अपने व्यवहार को शुरू में में प्रलेखित किया गया कॉल अनुभाग अजगर संदर्भ मैनुअल की। पीईपी 448 के साथ जहां *iterableदिखाई देने पर प्रतिबंध को ढीला कर दिया गया था, उसे सूची, सेट और टुपल शाब्दिकों में भी रखने की अनुमति दी गई थी, अभिव्यक्ति सूचियों पर संदर्भ पुस्तिका को भी इसे अद्यतन करने के लिए अद्यतन किया गया था।


हालांकि list(newdict)इस अंतर के बराबर है कि यह तेज़ है (कम से कम छोटे शब्दकोशों के लिए) क्योंकि कोई फ़ंक्शन कॉल वास्तव में नहीं किया जाता है:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

बड़े शब्दकोशों के साथ गति बहुत अधिक है (एक बड़े संग्रह के माध्यम से पुनरावृति की ओवरहेड एक फ़ंक्शन कॉल की छोटी लागत को ट्रम्प करती है)।


इसी तरह से, आप ट्यूल और डिक्शनरी कीज़ बना सकते हैं:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

टपल मामले में अनुगामी अल्पविराम से सावधान रहें!


महान स्पष्टीकरण, लेकिन कृपया आप किसी भी लिंक जो वाक्य रचना के इस "* newdict" प्रकार का वर्णन करता उल्लेख कर सकते हैं, मेरा मतलब है कि कैसे और क्यों सिर्फ understanding.Thanx के लिए शब्दकोश से रिटर्न कुंजी
मुहम्मद यूनुस

1
@ मायन्यूज़ सिंटैक्स काफी समय से उपलब्ध है, यहां तक ​​कि पायथन 2 में भी। फ़ंक्शन कॉल में आप def foo(*args): print(args)उसके बाद foo(*{1:0, 2:0})परिणाम (1, 2)प्रिंट कर सकते हैं । यह व्यवहार संदर्भ पुस्तिका के कॉल अनुभाग में निर्दिष्ट है । PEP 448 के साथ Python 3.5 ने उन प्रतिबंधों को ढीला कर दिया जहां ये [*{1:0, 2:0}]अब उपयोग करने की अनुमति दे सकते हैं। किसी भी तरह से, मैं अपना उत्तर संपादित करूँगा और इनमें शामिल करूँगा।
दिमित्री फासरकिस हिलियार्ड

1
*newdict- यह निश्चित रूप से कोड golfers के लिए जवाब है; पी। भी: जो, सभी ईमानदारी में, कुछ ऐसा नहीं है जिसके बारे में आपको वास्तव में चिंतित होना चाहिए - और यदि आप हैं, तो अजगर का उपयोग न करें
आर्टेमिस अभी भी

46

list(newdict)पाइथन 2 और पाइथन 3 दोनों में काम करता है, इसमें कुंजियों की एक सरल सूची प्रदान करता है newdictkeys()जरूरी नहीं है। (:


26

"डक टाइपिंग" परिभाषा पर थोड़ा हटकर - dict.keys()एक पुनरावृत्त वस्तु को लौटाता है, न कि सूची जैसी वस्तु को। यह कहीं भी काम करेगा एक चलने योग्य काम करेगा - किसी भी जगह पर सूची नहीं होगी। एक सूची भी एक चलने योग्य है, लेकिन एक चलने योग्य सूची नहीं है (या अनुक्रम ...)

वास्तविक उपयोग के मामलों में, एक तानाशाही में चाबियों के साथ सबसे आम बात यह है कि उनके माध्यम से पुनरावृति होती है, इसलिए यह समझ में आता है। और यदि आपको उनकी आवश्यकता है तो एक सूची के रूप में आप कॉल कर सकते हैं list()

बहुत कुछ इसी तरह से zip()- अधिकांश मामलों में, इसके माध्यम से इसे पुनरावृत्त किया जाता है - क्यों केवल इसके माध्यम से पुनरावृति करने के लिए टुपल्स की एक पूरी नई सूची बनाएं और फिर इसे फिर से फेंक दें?

यह अजगर की एक बड़ी प्रवृत्ति का हिस्सा है, जो सभी स्थानों पर सूचियों की प्रतियों के बजाय अधिक पुनरावृत्तियों (और जनरेटर) का उपयोग करता है।

dict.keys() हालांकि, समझ के साथ काम करना चाहिए - टाइपोस या कुछ और के लिए सावधानी से जांचें ... यह मेरे लिए ठीक काम करता है:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

2
आपको उपयोग करने की भी आवश्यकता नहीं है .keys(); शब्दकोश वस्तु है ही iterable और चाबी का उत्पादन जब से अधिक दोहराया: [key.split(", ") for key in d]
मार्टिन पीटर्स

25

तुम भी एक सूची समझ का उपयोग कर सकते हैं :

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

या, छोटा,

>>> [k  for  k in  newdict]
[1, 2, 3]

नोट: आदेश 3.7 के तहत संस्करणों पर गारंटी नहीं है (आदेश अभी भी केवल CPython 3.6 के साथ कार्यान्वयन विवरण है)।


6
बस उपयोग करें list(newdict)। यहां सूची बोध की कोई आवश्यकता नहीं है।
मार्टिन पीटर्स

8

keysविधि का उपयोग किए बिना किसी सूची में परिवर्तित करना इसे और अधिक पठनीय बनाता है:

list(newdict)

और, जब शब्दकोशों के माध्यम से लूपिंग, इसके लिए कोई आवश्यकता नहीं है keys():

for key in newdict:
    print key

जब तक आप इसे लूप के भीतर संशोधित नहीं कर रहे हैं, जिसके लिए पहले से बनाई गई चाबियों की सूची की आवश्यकता होगी:

for key in list(newdict):
    del newdict[key]

पायथन 2 पर एक सीमांत प्रदर्शन लाभ का उपयोग कर रहा हैkeys()


8

यदि आपको कुंजियों को अलग से संग्रहीत करने की आवश्यकता है, तो यहां एक समाधान है जिसे विस्तारित Iterable Unpacking (python3.x +) का उपयोग करते हुए अब तक प्रस्तुत हर दूसरे समाधान की तुलना में कम टाइपिंग की आवश्यकता होती है ।

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
             k = list(d)      9 characters (excluding whitespace)   
            ├───────────────┼─────────────────────────────────────────┤
             k = [*d]         6 characters                          
            ├───────────────┼─────────────────────────────────────────┤
             *k, = d          5 characters                          
            ╘═══════════════╧═════════════════════════════════════════╛

1
एकमात्र मामूली चेतावनी जो मैं इंगित करता हूं वह kयह है कि यहां हमेशा एक सूची होती है। यदि कोई उपयोगकर्ता टपल चाहता है या कुंजियों से सेट होता है, तो उन्हें दूसरे विकल्पों पर वापस जाने की आवश्यकता होगी।
दिमित्री फासरकिस हिलियार्ड

1
एक और अधिक ध्यान देने योग्य तथ्य यह है कि, एक बयान के रूप में, *k, = dइसकी सीमाएं हैं जहां यह दिखाई दे सकता है (लेकिन देखें, और शायद इस उत्तर को अपडेट करें, PEP 572 - विस्तारित अनपैकिंग असाइनमेंट ए.टी.एम. के लिए समर्थित नहीं है, लेकिन किसी दिन हो सकता है! )
दिमित्री फासरकिस हिलियार

क्या होगा यदि आप सूचियों की कुंजी और मान दोनों चाहते हैं?
एंडोलिथ

1
@endolith शायद keys, vals = zip(*d.items())(हालांकि वह दो ट्यूपल देता है, काफी करीब)। मुझे इससे छोटी अभिव्यक्ति की जानकारी नहीं है।
cs95

1

मैं 2 तरीकों के बारे में सोच सकता हूं जिसमें हम शब्दकोश से चाबियाँ निकाल सकते हैं।

विधि 1: - .keys () विधि का उपयोग करके कुंजियाँ प्राप्त करें और फिर इसे सूची में बदलें।

some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
-->[1,2,3]

विधि 2: - एक रिक्त सूची बनाने के लिए और फिर एक लूप के माध्यम से सूची में कुंजियाँ संलग्न करें। आप इस लूप के साथ मान भी प्राप्त कर सकते हैं (केवल कुंजी और मूल्य दोनों के लिए .its) का उपयोग करें (.keys)।

list_of_keys = []
list_of_values = []
for key,val in some_dict.items():
    list_of_keys.append(key)
    list_of_values.append(val)

print(list_of_keys)
-->[1,2,3]

print(list_of_values)
-->['one','two','three']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.