मेरे पास पात्रों की एक सूची है

a = ["s", "a"]

मेरे पास कुछ शब्द हैं।

b = "asp"

c= "lat"

d = "kasst"

मुझे पता है कि सूची में वर्ण केवल एक बार या रैखिक क्रम में प्रकट हो सकते हैं (या छोटे सेट पर अधिक से अधिक बड़े में दिखाई दे सकते हैं)।

मैं तत्वों को बीच में, बाकी को बाईं ओर या दाईं ओर रखकर अपने शब्दों को विभाजित करना चाहता हूं (और कुछ भी नहीं होने पर "=" डाल दें)

तो b = ["*", "as", "p"]

यदि वर्णों का एक बड़ा समूह जिसमें शामिल है

d = ["k", "ass", "t"]

मुझे पता है कि संयोजन अधिकतम लंबाई 4 के हो सकते हैं।

इसलिए मैंने लंबाई के आधार पर संभावित संयोजनों को विभाजित किया है:

import itertools

c4 = [''.join(i) for i in itertools.product(a, repeat = 4)]
c3 = [''.join(i) for i in itertools.product(a, repeat = 3)]
c2 = [''.join(i) for i in itertools.product(a, repeat = 2)]
c1 = [''.join(i) for i in itertools.product(a, repeat = 1)]

प्रत्येक सी के लिए, बड़े से शुरू करना सादगी के लिए, मान लीजिए कि मैं इस मामले में सी 3 से शुरू करता हूं और लंबाई 4 के साथ नहीं।

मुझे इसे बहुत सारे डेटा के साथ करना है।

क्या कोड को सरल बनाने का कोई तरीका है?

0
user9570622 4 अप्रैल 2018, 16:54

3 जवाब

सबसे बढ़िया उत्तर

आप नियमित अभिव्यक्ति का उपयोग करके कुछ ऐसा ही कर सकते हैं:

>>> import re
>>> p = re.compile(r'([sa]{1,4})')

p 1 और 4 बार के बीच दोहराए गए वर्णों 's' या 'a' से मेल खाता है।

किसी दिए गए स्ट्रिंग को इस पैटर्न पर विभाजित करने के लिए, p.split का उपयोग करें। प्रतिमान में कोष्ठकों को कैप्चर करने के उपयोग से प्रतिमान ही परिणाम में शामिल हो जाता है।

>>> p.split('asp')
['', 'as', 'p']
>>> p.split('lat')
['l', 'a', 't']
>>> p.split('kasst')
['k', 'ass', 't']
1
mkrieger1 4 अप्रैल 2018, 14:32

मिलान को सरल बनाने के लिए मैं नियमित अभिव्यक्ति करता हूं।

import re

splitters = ''.join(a)
pattern = re.compile("([^%s]*)([%s]+)([^%s]*)" % (splitters, splitters, splitters))
words = [v if v else '=' for v in pattern.match(s).groups() ]

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

इसके अलावा, आपको केवल एक बार re.compile चलाने की आवश्यकता है, न कि प्रत्येक स्ट्रिंग के लिए जिसे आप मिलान करने का प्रयास कर रहे हैं।

1
Sorin 4 अप्रैल 2018, 14:27

रेगेक्स का प्रयोग करें?

import re
a = ["s", "a"]
text = "kasst"
pattern = re.compile("[" + "".join(a) + "]{1,4}")
match = pattern.search(text)
parts = [text[:match.start()], text[match.start():match.end()], text[match.end():]]
parts = [part if part else "*" for part in parts]

हालांकि, ध्यान दें कि यह उस मामले को संभाल नहीं पाएगा जब तत्वों पर कोई मेल नहीं है a

1
Karl Knechtel 4 अप्रैल 2018, 14:22