2010-10-03 19 views
8

मैं इस question का उत्तर लिखने की कोशिश कर रहा था और यह पता लगाने में आश्चर्यचकित था कि सूचियों के लिए कोई विधि नहीं है, सूचियों में केवल इंडेक्स विधि है (तारों को ढूंढना और अनुक्रमणिका है)।पायथन: क्यों सूचीबद्ध सूची में कोई विधि नहीं है?

क्या कोई मुझे इसके पीछे तर्क बता सकता है? स्ट्रिंग्स दोनों क्यों हैं?

+0

यह प्रश्न इस सूची के बराबर है: "112131" .ind ("1213") => 1' यानी '[1,1,2,1,3,1]। ढूँढें ([1,2 , 1,3]) => 1' - यदि आप इसे * रैखिक समय में करना चाहते हैं * आपको स्ट्रिंग मिलान करने वाले एल्गोरिदम में से एक को स्वयं लागू करना होगा, जो इतना आसान नहीं है। –

उत्तर

7

मुझे नहीं पता कि कुछ पीईपी में कहीं क्यों या शायद दफनाया गया है, लेकिन मुझे सूचियों के लिए 2 बहुत ही बुनियादी "खोज" विधि पता है, और वे array.index() और in ऑपरेटर हैं। आप अपने आइटम खोजने के लिए हमेशा इन 2 का उपयोग कर सकते हैं। (इसके अलावा, पुनः मॉड्यूल, आदि)

+2

'इंडेक्स' विधि और 'इन' ऑपरेटर सूचियों में एकल आइटम ढूंढ सकता है (कोई मुझे बताएं कि क्या मैं उन्हें परमाणु कह सकता हूं)। ओपी जानना चाहता है कि क्या वह यह पता लगा सकता है कि सूची एक ही क्रम में दिखाई देने वाली वस्तुओं के साथ किसी अन्य की उप-सूची है या नहीं। – dheerosaur

+0

लेकिन पीछे मूल सिद्धांत भी सूची के माध्यम से पुनरावृत्ति है, चाहे वह घोंसला है या नहीं, और इन ऑपरेटरों के साथ उन्हें ढूंढना। ओपी इसके लिए अपनी विधि/कक्षाएं/जेनरेटर आदि विकसित करने के लिए भी स्वतंत्र है। – ghostdog74

+0

सरणी के लिए मानक 'ढूंढ' विधि एक आइटम की खोज करना है। कोई भी यह जानकर आश्चर्यचकित नहीं होगा कि एक सरणी कार्यान्वयन खोजों को सब्सक्राइब नहीं करता है। –

2

सूचियों के लिए "ढूंढें" विधि index है।

मैं विचार string.find और list.index के बीच विसंगति दुर्भाग्यपूर्ण होने के लिए करते हैं, दोनों नाम और व्यवहार में: string.find रिटर्न -1 जब कोई मुकाबला नहीं पाया जाता है, जहां list.index ValueError को जन्म देती है। यह अधिक लगातार डिजाइन किया जा सकता था। इन परिचालनों के बीच एकमात्र असहनीय अंतर यह है कि string.find वस्तुओं की एक स्ट्रिंग की खोज करता है, जहां list.index बिल्कुल एक आइटम की खोज करता है (जो अकेले, अलग-अलग नामों का उपयोग करके औचित्य नहीं देता है)।

+2

अगली बार जब आप एक आरईपीएल में 'asdfasdf ".index (' z ')' कोशिश करें। – aaronasterling

+0

@AaronMcSmooth: यह कोर स्ट्रिंग विधियों के लिए इसे पकड़ भी नहीं सकता है, जब यह "कुछ करने का एक स्पष्ट तरीका" की अलंकृतता की अनुपस्थिति को हाइलाइट करता है। –

+2

लेकिन मेरे उदाहरण का मुद्दा यह है कि वे इसे _do_ पकड़ते हैं। 'सूची' और' स्ट्रिंग 'दोनों में' इंडेक्स 'विधि होती है जो बिल्कुल वही व्यवहार करती है। यह सिर्फ 'स्ट्रिंग' उस पर शीर्ष पर 'ढूंढ' विधि जोड़ता है। मुझे यकीन नहीं है कि वे इसे 'सूची' के लिए क्यों नहीं करते हैं लेकिन 'list.index' और' string.find' के बीच कोई समानता नहीं है। – aaronasterling

3

मुझे लगता है कि अलग 'खोज' और 'इंडेक्स' विधियों के लिए तर्क पर्याप्त नहीं है कि वे काफी अलग नहीं हैं। सूची में मांग की गई वस्तु मौजूद होने पर दोनों एक ही चीज़ वापस कर देंगे (यह दो स्ट्रिंग विधियों के बारे में सच है); यदि मांग की गई सूची सूची/स्ट्रिंग में नहीं है तो वे अलग-अलग होते हैं; हालांकि आप किसी अन्य से खोजने/सूचकांक में से किसी एक को आसानी से बना सकते हैं। यदि आप अन्य भाषाओं से आ रहे हैं, तो यह एक गैर-त्रुटि स्थिति के लिए अपवादों को उठाने और पकड़ने के लिए खराब शिष्टाचार प्रतीत हो सकता है, जिसे आप आसानी से परीक्षण कर सकते हैं, लेकिन पायथन में, इसे अक्सर शूट करने के लिए अधिक पायथनिक माना जाता है और बाद में प्रश्न पूछता है , इस तरह के परीक्षणों के बजाय अपवाद हैंडलिंग का उपयोग करने के लिए (उदाहरण: Better to 'try' something and catch the exception or test if its possible first to avoid an exception?)।

मैं यह एक अच्छा विचार 'लगता है' 'में' 'सूचकांक' और से बाहर का निर्माण करने के लिए नहीं लगता है, जैसे

if foo in my_list: 
    foo_index = my_list.index(foo) 
else: 
    foo_index = -1 # or do whatever else you want 

दोनों में और सूचकांक एक हे की आवश्यकता होगी क्योंकि (एन) के ऊपर से गुजरती सूचि।

बेहतर/'सूचकांक' का बनाने के लिए 'खोज' और कोशिश पकड़ है, जैसे:,

try: 
    foo_index = my_list.index(foo) 
catch ValueError: 
    foo_index = -1 # or do whatever else you want 

अब के रूप में क्यों सूची (केवल सूचकांक के साथ) इस तरह से बनाया गया था, और स्ट्रिंग बनाया गया था दूसरी तरफ (अलग इंडेक्स और ढूंढें) ... मैं नहीं कह सकता।

संबंधित मुद्दे