2013-07-28 21 views
31

我想在列表中存儲很多單詞。許多這些詞非常相似。例如,我有文字afrykanerskojęzyczny和許多單詞,如afrykanerskojęzycznym,afrykanerskojęzyczni, nieafrykanerskojęzyczni。什麼是有效的(快速和給予小差異大小)解決方案來找出兩個字符串之間的差異,並從第一個字符串和差異恢復第二個字符串?Python - 兩個字符串之間的區別

+0

你的**意思「恢復第二個字符串從第一個和差異「?** – jrd1

+1

我相信他的意思是」使第二個字符串與第一個相同「。 –

+0

@EliasBenevedes,正好:)。 – 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

謝謝,但實際上我想用'nieafrykanerskojęzyczni'這樣的記憶高效的方式存儲,使用與'afrykanerskojęzyczny'的相似性。 – 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 Python有* so *許多有用的模塊。我似乎每天都會學習一個新的。 – arshajii

+0

這是手動逐步通過差異;恢復兩個字符串之間的差異,當然,使用[difflib.restore]更容易(http://docs.python.org/2/library/difflib.html#difflib.restore) – dawg

+0

謝謝!但我不確定這是否有效。 list(difflib.ndiff(「afrykanerskojęzyczny」,「nieafrykanerskojęzyczny」)) ['+ n','+ i','+ e','a','f','r','y',' k','a','n','e','r','s','k','o','j','è','z','y','c' ,'z','n','y'] – user2626682

2

你所要求的是壓縮的一種特殊形式。 xdelta3是爲這種特殊類型的壓縮而設計的,它有一個python綁定,但你可能會直接使用zlib。您希望使用zlib.compressobjzlib.decompressobj,將zdict參數設置爲您的「基本單詞」,例如, afrykanerskojęzyczny

注意事項是zdict僅在Python 3.3及更高版本中受支持,並且如果您對所有差異具有相同的「基本單詞」,則該代碼最容易編碼,而這可能是也可能不是您想要的。

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] != ' '] 
相關問題