>>> d = {"foo": 12, "bar": 2, "jim": 4, "bob": 17}
>>> [k for k, v in d.items() if v > 6] # Use d.iteritems() on python 2.x
['bob', 'foo']
मैं बस भी @glarrain जो मैं अपने आप को आजकल का उपयोग करने के लिए प्रवृत्त खोजने के द्वारा समाधान का प्रदर्शन करने के इस जवाब को अद्यतन करना चाहते हैं।
[k for k in d if d[k] > 6]
यह पूरी तरह से पार संगत है और .iteritems
से एक भ्रामक परिवर्तन की आवश्यकता नहीं है (.iteritems
से बचा जाता है अजगर 2 पर स्मृति जो अजगर 3 में तय हो गई है करने के लिए एक सूची बचत) .items
करने के लिए।
@ Prof.Falken इस समस्या का समाधान उल्लेख
from six import iteritems
प्रभावी ढंग से पार संगतता के मुद्दों को ठीक करता है, लेकिन आप की आवश्यकता है जो
पैकेज six
हालांकि मैं पूरी तरह से @glarrain से सहमत नहीं हैं डाउनलोड करने के लिए कि यह समाधान अधिक पठनीय है, जो बहस के लिए है और शायद एक व्यक्तिगत वरीयता है, भले ही पायथन को ऐसा करने का केवल 1 तरीका होना चाहिए। मेरी राय में यह स्थिति पर निर्भर करता है (उदाहरण के लिए। आपके पास एक लंबा शब्दकोश नाम हो सकता है जिसे आप दो बार टाइप नहीं करना चाहते हैं या आप मानों को अधिक पठनीय नाम या कुछ अन्य कारण देना चाहते हैं)
कुछ दिलचस्प समय :
पायथन 2 में, दूसरा समाधान तेज है, पायथन 3 में वे कच्चे गति में लगभग बराबर हैं।
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 0.772 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.iteritems() if v > 6]'
1000000 loops, best of 3: 0.508 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 0.45 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 1.02 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 1.02 usec per loop
हालांकि इन छोटे शब्दकोशों के लिए ही परीक्षण कर रहे हैं, विशाल शब्दकोशों में मैं बहुत यकीन है कि एक शब्दकोश कुंजी देखने (d[k]
) नहीं होने .items
बहुत तेजी से होगा हूँ। और इस मामले
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 1.75 sec per loop
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.iteritems() if v > 6]'
1 loops, best of 3: 1.71 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 3.08 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.items() if v > 6]'
1 loops, best of 3: 2.47 sec per loop
इस सवाल का शीर्षक क्या आप वास्तव में (हासिल करना चाहते हैं के बाद से बदल दिया जाना चाहिए और जवाब यह दर्शाते हैं) एक शब्दकोश में संबंधित मानों की कुंजी प्राप्त होती है जिसके लिए एक निश्चित खंड सत्य होता है। कुछ "इसके संबंधित मानों के आधार पर शब्दकोश कुंजी को कैसे फ़िल्टर करें" जैसे कुछ बेहतर विकल्प हो सकता है। – glarrain