tl; डॉ
एक जनरेटर अभिव्यक्ति शायद आपकी समस्या का सबसे प्रभावी और सरल समाधान है:
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
result = next((i for i, v in enumerate(l) if v[0] == 53), None)
# 2
व्याख्या
ऐसे कई उत्तर हैं जो सूची के प्रश्नों के साथ इस प्रश्न का एक सरल समाधान प्रदान करते हैं। हालांकि ये जवाब पूरी तरह से सही हैं, लेकिन वे इष्टतम नहीं हैं। आपके उपयोग के मामले के आधार पर, कुछ सरल संशोधन करने के लिए महत्वपूर्ण लाभ हो सकते हैं।
इस उपयोग के मामले के लिए एक सूची समझ का उपयोग करने के साथ मैं जो मुख्य समस्या देख रहा हूं वह यह है कि पूरी सूची संसाधित हो जाएगी, हालांकि आप केवल इस तत्व को खोजना चाहते हैं ।
पायथन एक सरल निर्माण प्रदान करता है जो यहां आदर्श है। इसे जनरेटर अभिव्यक्ति कहा जाता है । यहाँ एक उदाहरण है:
# Our input list, same as before
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
# Call next on our generator expression.
next((i for i, v in enumerate(l) if v[0] == 53), None)
हम इस पद्धति से मूल रूप से हमारे तुच्छ उदाहरण में सूची समझ के समान प्रदर्शन करने की उम्मीद कर सकते हैं, लेकिन क्या होगा यदि हम एक बड़े डेटा सेट के साथ काम कर रहे हैं? यहीं से जनरेटर पद्धति का उपयोग करने का फायदा मिलता है। एक नई सूची का निर्माण करने के बजाय, हम आपकी मौजूदा सूची को हमारे चलने के रूप में उपयोग करेंगे, और next()
हमारे जनरेटर से पहली वस्तु प्राप्त करने के लिए उपयोग करेंगे ।
आइए देखें कि कैसे ये तरीके कुछ बड़े डेटा सेटों पर अलग-अलग प्रदर्शन करते हैं। ये बड़ी सूचियाँ हैं, जो 10000000 + 1 तत्वों से बनी हैं, हमारे लक्ष्य के साथ शुरुआत (सर्वोत्तम) या अंत (सबसे खराब) हैं। हम सत्यापित कर सकते हैं कि ये दोनों सूचियाँ निम्नलिखित सूची समझ का उपयोग करके समान रूप से प्रदर्शन करेंगी:
सूची की समझ
"सबसे खराब मामला"
worst_case = ([(False, 'F')] * 10000000) + [(True, 'T')]
print [i for i, v in enumerate(worst_case) if v[0] is True]
# [10000000]
# 2 function calls in 3.885 seconds
#
# Ordered by: standard name
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 1 3.885 3.885 3.885 3.885 so_lc.py:1(<module>)
# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
"सबसे अच्छा मामला"
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print [i for i, v in enumerate(best_case) if v[0] is True]
# [0]
# 2 function calls in 3.864 seconds
#
# Ordered by: standard name
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 1 3.864 3.864 3.864 3.864 so_lc.py:1(<module>)
# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
जनक भाव
यहां जनरेटर के लिए मेरी परिकल्पना है: हम देखेंगे कि जनरेटर सबसे अच्छे मामले में बेहतर प्रदर्शन करेंगे, लेकिन इसी तरह सबसे खराब स्थिति में भी। यह प्रदर्शन लाभ ज्यादातर इस तथ्य के कारण है कि जनरेटर का आलसी रूप से मूल्यांकन किया जाता है, जिसका अर्थ है कि यह केवल गणना करेगा कि किसी मूल्य का उत्पादन करने के लिए क्या आवश्यक है।
सबसे खराब मामला
# 10000000
# 5 function calls in 1.733 seconds
#
# Ordered by: standard name
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 2 1.455 0.727 1.455 0.727 so_lc.py:10(<genexpr>)
# 1 0.278 0.278 1.733 1.733 so_lc.py:9(<module>)
# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
# 1 0.000 0.000 1.455 1.455 {next}
सबसे अच्छा मामला
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print next((i for i, v in enumerate(best_case) if v[0] == True), None)
# 0
# 5 function calls in 0.316 seconds
#
# Ordered by: standard name
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 1 0.316 0.316 0.316 0.316 so_lc.py:6(<module>)
# 2 0.000 0.000 0.000 0.000 so_lc.py:7(<genexpr>)
# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
# 1 0.000 0.000 0.000 0.000 {next}
क्या?! सबसे अच्छा मामला सूची समझ को नष्ट कर देता है, लेकिन मैं इस हद तक सूची की समझ को बेहतर बनाने के लिए हमारे सबसे खराब मामले की उम्मीद नहीं कर रहा था। यह कैसा है? सच कहूँ तो, मैं केवल और अधिक शोध के बिना अटकलें लगा सकता था।
नमक के दाने के साथ यह सब ले लो, मैंने यहां कोई मजबूत रूपरेखा नहीं बनाई है, बस कुछ बहुत ही बुनियादी परीक्षण। यह सराहना करने के लिए पर्याप्त होना चाहिए कि इस प्रकार की सूची खोज के लिए एक जनरेटर अभिव्यक्ति अधिक निष्पादित है।
ध्यान दें कि यह सभी बुनियादी, अंतर्निहित अजगर है। हमें कुछ भी आयात करने या किसी लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है।
मैंने पहली बार पीटर नॉरविग के साथ उनेसिटी सीएस 212 कोर्स में खोज करने के लिए इस तकनीक को देखा ।