2013-07-28 9 views
31

के बीच अंतर मैं एक सूची में बहुत से शब्दों को स्टोर करना चाहता हूं। इनमें से कई शब्द बहुत समान हैं। उदाहरण के लिए मेरे पास afrykanerskojęzyczny शब्द और afrykanerskojęzycznym, afrykanerskojęzyczni, nieafrykanerskojęzyczni जैसे कई शब्द हैं। दो तारों के बीच अंतर खोजने के लिए प्रभावी (तेज और देने वाला छोटा अंतर आकार) समाधान क्या है और पहले स्ट्रिंग को दूसरी स्ट्रिंग को पुनर्स्थापित करें और diff?पायथन - दो स्ट्रिंग्स

+0

आप द्वारा ** क्या मतलब है "दूसरी स्ट्रिंग बहाल पहले से और diff "? ** – jrd1

+1

मुझे विश्वास है कि उसका मतलब है" दूसरी स्ट्रिंग को पहले जैसा ही बनाएं "। –

+0

@ एलियासबेनेवेस, बिल्कुल :)। – user2626682

उत्तर

2

आप regex module (अस्पष्ट अनुभाग) में देख सकते हैं। मैं अगर आप वास्तविक मतभेद प्राप्त कर सकते हैं पता नहीं, लेकिन कम से कम आप डालने की तरह परिवर्तन के विभिन्न प्रकार की अनुमत संख्या निर्दिष्ट कर सकते हैं, हटा सकते हैं और प्रतिस्थापन:

import regex 
sequence = 'afrykanerskojezyczny' 
queries = [ 'afrykanerskojezycznym', 'afrykanerskojezyczni', 
      'nieafrykanerskojezyczni' ] 
for q in queries: 
    m = regex.search(r'(%s){e<=2}'%q, sequence) 
    print 'match' if m else 'nomatch' 
+0

धन्यवाद, मैं इसके बारे में पढ़ूंगा। – user2626682

0

मूल पर ऊपर मेरी टिप्पणी का जवाब प्रश्न मुझे लगता है कि यह सब वह चाहता है बनाता है:

loopnum = 0 
word = 'afrykanerskojęzyczny' 
wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni'] 
for i in wordlist: 
    wordlist[loopnum] = word 
    loopnum += 1 

यह निम्न करेगा:

wordlist में हर मूल्य के लिए, मूल कोड को wordlist की है कि मूल्य निर्धारित किया है।

आपको बस इतना करना है कि आपको कोड का यह टुकड़ा डालना है जहां आपको शब्द सूची बदलने की ज़रूरत है, यह सुनिश्चित कर लें कि आप शब्दकोष में बदलने के लिए आवश्यक शब्दों को संग्रहीत करते हैं, और मूल शब्द सही है।

आशा है कि इससे मदद मिलती है!

+0

धन्यवाद, लेकिन असल में मैं 'afiekanerskojęzyczny' की समानता का उपयोग करते हुए, एक स्मृति कुशल तरीके से 'nieafrykanerskojęzyczni' जैसे शब्दों को संग्रहीत करना चाहता हूं। – user2626682

48

आप ऐसा करने के लिए difflib मॉड्यूल में ndiff का उपयोग कर सकते हैं। इसमें एक स्ट्रिंग को दूसरी स्ट्रिंग में बदलने के लिए आवश्यक सभी जानकारी है।

एक साधारण उदाहरण:

import difflib 

cases=[('afrykanerskojęzyczny', 'afrykanerskojęzycznym'), 
     ('afrykanerskojęzyczni', 'nieafrykanerskojęzyczni'), 
     ('afrykanerskojęzycznym', 'afrykanerskojęzyczny'), 
     ('nieafrykanerskojęzyczni', 'afrykanerskojęzyczni'), 
     ('nieafrynerskojęzyczni', 'afrykanerskojzyczni'), 
     ('abcdefg','xac')] 

for a,b in cases:  
    print('{} => {}'.format(a,b)) 
    for i,s in enumerate(difflib.ndiff(a, b)): 
     if s[0]==' ': continue 
     elif s[0]=='-': 
      print(u'Delete "{}" from position {}'.format(s[-1],i)) 
     elif s[0]=='+': 
      print(u'Add "{}" to position {}'.format(s[-1],i))  
    print()  

प्रिंट:

afrykanerskojęzyczny => afrykanerskojęzycznym 
Add "m" to position 20 

afrykanerskojęzyczni => nieafrykanerskojęzyczni 
Add "n" to position 0 
Add "i" to position 1 
Add "e" to position 2 

afrykanerskojęzycznym => afrykanerskojęzyczny 
Delete "m" from position 20 

nieafrykanerskojęzyczni => afrykanerskojęzyczni 
Delete "n" from position 0 
Delete "i" from position 1 
Delete "e" from position 2 

nieafrynerskojęzyczni => afrykanerskojzyczni 
Delete "n" from position 0 
Delete "i" from position 1 
Delete "e" from position 2 
Add "k" to position 7 
Add "a" to position 8 
Delete "ę" from position 16 

abcdefg => xac 
Add "x" to position 0 
Delete "b" from position 2 
Delete "d" from position 4 
Delete "e" from position 5 
Delete "f" from position 6 
Delete "g" from position 7 
+5

+1 पायथन में * बहुत * उपयोगी मॉड्यूल हैं। ऐसा लगता है कि मैं हर दिन एक नए बारे में सीखता हूं। – arshajii

+0

यह मैन्युअल रूप से अंतर के माध्यम से कदम उठा रहा है; दो स्ट्रिंग्स के बीच अलग-अलग बहाल करना, [difflib.restore] (http://docs.python.org/2/library/difflib.html#difflib.restore) – dawg

+0

धन्यवाद के साथ बहुत आसान है! लेकिन मुझे यकीन नहीं है कि यह स्मृति कुशल है या नहीं। सूची (difflib.ndiff ("afrykanerskojęzyczny", "nieafrykanerskojęzyczny") ['+ n', '+ i', '+ e', 'a', 'f', 'r', 'y', ' के ',' ए ',' एन ',' ई ',' आर ',' एस ',' के ',' ओ ',' जे ',' ę ',' जेड ',' वाई ',' सी ' , 'z', 'n', 'y'] – user2626682

2

क्या आप के लिए पूछ रहे हैं संपीड़न के एक विशेष रूप है। xdelta3 इस विशेष प्रकार के संपीड़न के लिए डिज़ाइन किया गया था, और इसके लिए एक अजगर बाध्यकारी है, लेकिन आप शायद ज़्लिब का उपयोग सीधे कर सकते हैं। आप zlib.compressobj और zlib.decompressobj का उपयोग zdict पैरामीटर के साथ अपने "मूल शब्द" पर सेट करना चाहते हैं, उदाहरण के लिए afrykanerskojęzyczny

कैविट zdict केवल पायथन 3.3 और उच्चतर में समर्थित है, और यदि आपके पास अपने सभी diffs के लिए "मूल शब्द" है, तो यह कोड करना सबसे आसान है, जो आप चाहते हैं या नहीं भी हो सकता है।

0

मैं ndiff जवाब चाहते, लेकिन अगर आप यह सब थूक के लिए एक ही परिवर्तन की सूची में चाहते हैं, आप की तरह कुछ कर सकता है:

import difflib 

case_a = 'afrykbnerskojęzyczny' 
case_b = 'afrykanerskojęzycznym' 

output_list = [li for li in list(difflib.ndiff(a,b)) if li[0] != ' '] 
संबंधित मुद्दे