अजगर में शब्दकोश के लिए enumerate ()


84

मुझे पता है कि हम enumerateएक सूची को पुनरावृत्त करने के लिए उपयोग करते हैं लेकिन मैंने इसे एक शब्दकोश में आज़माया और यह एक त्रुटि नहीं थी।

कोड:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

उत्पादन:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

क्या कोई आउटपुट समझा सकता है?


2
for i, j in enumerate(enumm) हो जाता है iकि हर यात्रा में वृद्धि की जाती है, और jसे हमेशा की तरह आइटम पकड़ता enumerateसमारोह तर्क है, जो इस मामले में एक शब्दकोश है। Dicts पर Iterating अनिवार्य रूप से अपनी कुंजियों पर चलना है।
दिव्यांशु श्रीवास्तव

जवाबों:


119

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

आप जिस सामान्य मामले में शब्दकोश की कुंजियों की गणना करते हैं :

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

कौन से आउटपुट:

0 1
1 2
2 3
3 4

लेकिन अगर आप दोनों कुंजियों और मूल्यों के माध्यम से गणना करना चाहते हैं तो यह तरीका है:

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

कौन से आउटपुट:

0 1 a
1 2 b
2 3 c
3 4 d

1
(+1) dictionary.items()टुपल्स की सूची के रूप में कुंजी-मूल्य वाले जोड़े के साथ एक दृश्य वस्तु प्राप्त करने के लिए आप बस (बिना गणना के) का उपयोग कर सकते हैं ।
टियागो मार्टिंस पेरेस

62

आउटपुट का पहला कॉलम प्रत्येक आइटम का इंडेक्स है enummऔर दूसरा इसकी कुंजी है। यदि आप अपने शब्दकोश को पुनरावृत्त करना चाहते हैं, तो .items () का उपयोग करें:

for k, v in enumm.items():
    print(k, v)

और आउटपुट जैसा दिखना चाहिए:

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

32

मैंने सोचा था कि यदि आप एक शब्दकोष के सूचकांक, कुंजी और मूल्यों पर गणना करना चाहते हैं, तो आपके लिए लूप की तरह दिखना चाहिए:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)

3
यह प्रश्न वाक्यविन्यास के बारे में मुद्दों से संबंधित है, और इस उत्तर ने दो जोड़े गए कोष्ठक का सबसे छोटा समाधान प्रदान किया:idx, (k, v) in enumerate(d.items()):
सीन पियानका

1
हाय शॉन, मुझे यकीन नहीं है कि आप उत्तर से सहमत हैं या बस कह रहे हैं कि छोटे चर नाम बेहतर उत्तर के लिए बनाते हैं?
जॉर्डन मैकी

26
dict1={'a':1, 'b':'banana'}

पायथन 2.x में शब्दकोश सूचीबद्ध करने के लिए:

for k,v in dict1.iteritems():
        print k,v 

पायथन 3.x उपयोग में:

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

अंत में, जैसा कि अन्य ने संकेत दिया है, यदि आप एक रनिंग इंडेक्स चाहते हैं, तो आपके पास वह भी हो सकता है:

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

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


2
यह मुझे इस पोस्ट पर 2 कैरेक्टर एडिट नहीं करने दे रहा है, लेकिन ओपी ने इसे पायथन 3 के रूप में टैग किया है, इसलिए प्रिंट स्टेटमेंट में k, v के आसपास कोष्ठक होना चाहिए।
wp-overwatch.com

@श्री। मुझे, ty, ठीक कर देगा।
रोडरनर 66

19
यह केवल python2 के लिए उपलब्ध है ध्यान दिया जाना चाहिए। python3 में dict.iteritems () को हटा दिया गया, यह भी देखें stackoverflow.com/questions/30418481/…
gyger

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

Ty। Python3 बनाम python2 अपडेट किया गया। गणना पर टिप्पणी जोड़ा गया।
रोडरनर 66

5

चूंकि आप उपयोग कर रहे हैं enumerateइसलिए आपका iवास्तव में कुंजी के बजाय कुंजी का सूचकांक है।

तो, आप 3पंक्ति के पहले कॉलम में मिल रहे हैं, 3 4भले ही कोई कुंजी न हो 3

enumerate एक डेटा संरचना (यह सूची या एक शब्दकोश हो) के माध्यम से पुनरावृत्त करता है, जबकि वर्तमान पुनरावृत्ति संख्या भी प्रदान करता है।

इसलिए, यहाँ कॉलम में कुंजी के बाद शब्दकोष संख्या है enum

अन्य समाधान पहले ही दिखा चुके हैं कि कुंजी और मूल्य जोड़ी पर पुनरावृति कैसे करें ताकि मैं उसी को फिर से दोहराऊं नहीं।


4

enumerate()जब सूची पर काम करना वास्तव में सूची के अंदर सूचकांक और वस्तुओं का मूल्य देता है। उदाहरण के लिए:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

देता है

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

जहाँ पहला कॉलम आइटम के इंडेक्स को दर्शाता है और दूसरा कॉलम आइटम को ही दर्शाता है।

शब्दकोश मे

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

यह आउटपुट देता है

0 0
1 1
2 2
3 4
4 5
5 6
6 7

जहाँ पहला कॉलम key:valueजोड़े का इंडेक्स देता है और दूसरा कॉलम keysडिक्शनरी के शब्दों को दर्शाता है enumm

इसलिए यदि आप चाहते हैं कि पहला कॉलम keysदूसरा और दूसरा कॉलम हो values, तो बेहतर प्रयास करें dict.iteritems()(पायथन 2) या dict.items()(पायथन 3)

for i, j in enumm.items():
    print(i, j)

उत्पादन

0 1
1 2
2 3
4 4
5 5
6 6
7 7

देखा


1
यह शब्दकोशों के लिए सही नहीं है। आपका कोड एक अनुक्रमणिका (पुनरावृत्ति के लिए) का उपयोग करके शब्दकोश में पुनरावृति करेगा, लेकिन शब्दकोश के मुख्य-मूल्य संयोजनों को नहीं देगा। इसके बजाय dict.items () का उपयोग करें।
मथायस

हाँ आप तानाशाही () के साथ भी आगे बढ़ सकते हैं। सुधारों के लिए धन्यवाद।
अभिषेक रॉय

3

यकीन है कि भ्रमित होना चाहिए। तो यह क्या चल रहा है। एन्यूमरेट का पहला मान (इस मामले में i) 0, 1, 2, 3, पर शुरू होने वाले अगले इंडेक्स वैल्यू को लौटाता है ... यह हमेशा इन नंबरों को वापस कर देगा चाहे जो भी डिक्शनरी में हो। एन्यूमरेट का दूसरा मान (इस स्थिति में j) आपके डिक्शनरी / एनमम में मान लौटा रहा है (हम इसे पायथन में डिक्शनरी कहते हैं)। आप वास्तव में क्या करना चाहते हैं रोडरनर 66 ने किसके साथ प्रतिक्रिया दी।


3
  1. एक पायथन से अधिक तानाशाह होने का अर्थ है कि इसकी चाबी पर ठीक उसी तरह से चलना dict.keys()
  2. कुंजियों का क्रम कार्यान्वयन कोड द्वारा निर्धारित किया जाता है और आप कुछ विशिष्ट आदेश की उम्मीद नहीं कर सकते हैं:

    कुंजी और मान एक मनमाने ढंग से क्रम से अधिक पुनरावृत्त होते हैं जो गैर-यादृच्छिक होते हैं, पायथन कार्यान्वयन पर भिन्न होते हैं, और आवेषण और विलोपन के शब्दकोश के इतिहास पर निर्भर करते हैं। यदि कुंजियों, मूल्यों और वस्तुओं के विचारों को शब्दकोश में कोई हस्तक्षेप करने वाले संशोधनों के साथ पुनरावृत्त किया जाता है, तो वस्तुओं का क्रम सीधे अनुरूप होगा।

इसीलिए आपको पहले कॉलम में 0 से 7 के सूचकांक दिखाई देते हैं। वे द्वारा उत्पादित कर रहे हैं enumerateऔर हमेशा सही क्रम में हैं। आगे आपको दूसरे कॉलम में तानाशाह की चाबी 0 से 7 दिखाई देती है। उनकी छँटनी नहीं की जाती है।


3

python3:

एक हल:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

एक और उदाहरण:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}

1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

उत्पादन:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]

0

इंडेक्स कुंजी के अंदर शामिल करने के लिए आपको उपयोगी मिल सकता है:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

आउटपुट:

{(0, 'a'): True, (1, 'b'): False}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.