2010-05-06 7 views
20

में सभी मानों के साथ स्ट्रिंग की तुलना करें मैं पाइथन के माध्यम से गड़बड़ करने की कोशिश कर रहा हूं, और चीजों को करने का सबसे अच्छा तरीका सीख रहा हूं।सरणी

if paid[j].find(d)>=0: 
    #BLAH BLAH 

तो 'प' एक सरणी थे, क्या हुआ अगर स्ट्रिंग में निहित भुगतान किया देखने के लिए सबसे कारगर तरीका है: मैं एक स्ट्रिंग जहां मैं एक अगर वहाँ एक मैच देखने के लिए एक और तार के साथ तुलना कर रहा हूँ है [जे] 'डी' में किसी भी मूल्य के लिए एक मैच है?

+0

क्या आप समझा सकते हैं कि 'मिलान' में किसी भी मूल्य से आपका मिलान क्या है? आप "मैच" के रूप में क्या मानते हैं? क्या आपको तारों को समान होने की आवश्यकता है? –

+1

आपके उत्तर के लिए धन्यवाद। हाँ मेरा मतलब सूचियां थीं। क्षमा करें, अभी भी सीखना। मेरा मतलब यह था कि भुगतान [जे] (एक वाक्य) और सूची 'डी' के बीच एक पैटर्न के बीच एक पैटर्न मैच था या नहीं। – Nathan

उत्तर

38

आप केवल, जानना चाहते हैं कि d के किसी भी आइटम paid[j] में निहित है चाहते हैं के रूप में आप सचमुच कहते हैं:

if any(x in paid[j] for x in d): ... 

आप भी चाहते हैं जानने के लिएd के आइटममें निहित हैं:

contained = [x for x in d if x in paid[j]] 

containedd की कोई आइटम paid[j] में निहित हैं, तो एक खाली सूची हो जाएगा।

अन्य समाधान कर रहे हैं अभी तक क्या आप चाहते हैं अगर अभी तक एक और विकल्प, जैसे, d की पहले आइटम paid[j] में निहित (और None अगर कोई आइटम तो निहित है) मिलता है:

firstone = next((x for x in d if x in paid[j]), None) 

BTW , क्योंकि एक टिप्पणी में आप वाक्यों और शब्दों का उल्लेख करते हैं, शायद आप स्ट्रिंग चेक (जो मेरे सभी उदाहरण कर रहे हैं) की आवश्यकता नहीं है, क्योंकि वे शब्द सीमाओं पर विचार नहीं कर सकते हैं - उदाहरण के लिए, प्रत्येक उदाहरण में कहा जाएगा कि 'बिल्ली' in 'obfuscate' है (क्योंकि, 'obfuscate' में 'cat' एक सबस्ट्रिंग के रूप में है)। सरल सबस्ट्रिंग चेक की बजाय शब्द सीमाओं पर चेक की अनुमति देने के लिए, आप उत्पादक नियमित रूप से अभिव्यक्तियों का उपयोग कर सकते हैं ... लेकिन मेरा सुझाव है कि आप उस पर एक अलग प्रश्न खोलें, अगर आपको इसकी आवश्यकता है - इस उत्तर में सभी कोड स्निपेट्स आपकी सटीक आवश्यकताओं पर, यदि आप उचित आरई ऑब्जेक्ट somere के लिए somere.search(paid[j]) जैसे कुछ अधिक परिष्कृत भविष्यवाणी में x in paid[j] को भविष्यवाणी करते हैं तो भविष्य में अच्छी तरह से काम करेंगे। (पायथन 2.6 या बेहतर - 2.5 और उससे पहले में मामूली अंतर)।

आपका इरादा कुछ इस तरह के एक या एक से सूचकांक मदों की d में अपने विवश को संतुष्ट करने का सब हो रही के रूप में किसी और फिर से है, तो, वहाँ उन विभिन्न समस्याओं, भी के लिए आसान समाधान कर रहे हैं ... लेकिन, अगर तुम क्या वास्तव में जो कुछ आपने कहा है उससे बहुत दूर है, मैं बेहतर अनुमान लगाने से रोकता हूं और आशा करता हूं कि आप स्पष्टीकरण दें ;-)।

+0

यह एक उत्कृष्ट स्पष्टीकरण है, धन्यवाद। मेरा लक्ष्य है कि मैंने इस एचटीएमएल कोड को लिंक की तलाश में पार्स किया है। एक बार जब उनकी एक सूची हो, तो मैं उस सूची के माध्यम से जाता हूं और इसे मास्टर सूची 'डी' के साथ तुलना करता हूं। स्ट्रिंग मैचों की तुलना करने का कारण यह है कि मुझे पार्स किए गए एचटीएमएल में एक लिंक मिल सकता है जो डोमेन.com पर जाता है, लेकिन यह 'डी' में कुछ भी मेल नहीं खाता है, हालांकि मैं इसे www.domain.com के खिलाफ मैच करना चाहता हूं । आपकी व्याख्या से, यह वही करेगा जो मैं चाहता हूं, है ना? यदि कोई है (x में भुगतान के लिए x [x] में x): ... – Nathan

+0

@ हलिक, हाँ, जब तक आप भी ढूंढना चाहते हैं (उदाहरण के लिए) 'notreallywww.domain.com' और 'www.domain.com .fooledya.org'। यदि आप ऐसे नकली मैचों को नहीं चाहते हैं, तो आपको सादे स्ट्रिंग-मिलान की तुलना में अधिक परिष्कृत दृष्टिकोण की आवश्यकता है। लेकिन 'अगर कोई है (...' हिस्सा अभी भी सही है, बस एक अलग भविष्यवाणी के साथ (उस भाग के लिए एक अलग प्रश्न खोलें)। –

+0

धन्यवाद! इस विषय के बारे में सिर्फ एक नया प्रश्न खोला। – Nathan

6

मुझे लगता है कि आप list और array नहीं मानते हैं? पाइथन में एक सरणी के रूप में ऐसी चीज है, लेकिन अक्सर आप सरणी के बजाय सूची नहीं चाहते हैं।

तरह से जाँच करने के लिए एक सूची है एक मूल्य in उपयोग करने के लिए है अगर:

if paid[j] in d: 
    # ... 
2

अजगर में आप in ऑपरेटर का उपयोग कर सकते हैं। आप इस तरह सामान कर सकते हैं:

>>> "c" in "abc" 
True 

इस आगे ले जाने पर आप, जटिल संरचनाओं के लिए जाँच कर सकते हैं tuples की तरह:

>>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8)) 
True 
0
for word in d: 
    if d in paid[j]: 
     do_something() 

सूची d में सभी शब्दों कोशिश करते हैं और अगर जाँच करेगा वे स्ट्रिंग paid[j] में पाए जा सकते हैं।

यह बहुत प्रभावी नहीं है क्योंकि paid[j]d में प्रत्येक शब्द के लिए फिर से स्कैन किया जाना है। आप दो सेट का भी उपयोग कर सकते हैं, वाक्य में शब्दों में से एक, आपकी सूची में से एक, और फिर सेट के चौराहे को देखें।

sentence = "words don't come easy" 
d = ["come", "together", "easy", "does", "it"] 

s1 = set(sentence.split()) 
s2 = set(d) 

print (s1.intersection(s2)) 

आउटपुट:

{'come', 'easy'}