我想在列表中存儲很多單詞。許多這些詞非常相似。例如,我有文字afrykanerskojęzyczny
和許多單詞,如afrykanerskojęzycznym
,afrykanerskojęzyczni
, nieafrykanerskojęzyczni
。什麼是有效的(快速和給予小差異大小)解決方案來找出兩個字符串之間的差異,並從第一個字符串和差異恢復第二個字符串?Python - 兩個字符串之間的區別
回答
您可以查看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'
謝謝,我會讀到它。 – user2626682
這個問題的答案我上面的評論原始提問讓我覺得這一切他想要的:
loopnum = 0
word = 'afrykanerskojęzyczny'
wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni']
for i in wordlist:
wordlist[loopnum] = word
loopnum += 1
這將做到以下幾點:
對於單詞表的每個值,詞表的該值設置爲原始代碼。
所有你需要做的就是把這段代碼放到你需要改變wordlist的地方,確保你把需要改變的單詞存儲在wordlist中,並且原始單詞是正確的。
希望這有助於!
謝謝,但實際上我想用'nieafrykanerskojęzyczni'這樣的記憶高效的方式存儲,使用與'afrykanerskojęzyczny'的相似性。 – user2626682
您可以在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
+1 Python有* so *許多有用的模塊。我似乎每天都會學習一個新的。 – arshajii
這是手動逐步通過差異;恢復兩個字符串之間的差異,當然,使用[difflib.restore]更容易(http://docs.python.org/2/library/difflib.html#difflib.restore) – dawg
謝謝!但我不確定這是否有效。 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
你所要求的是壓縮的一種特殊形式。 xdelta3是爲這種特殊類型的壓縮而設計的,它有一個python綁定,但你可能會直接使用zlib。您希望使用zlib.compressobj
和zlib.decompressobj
,將zdict
參數設置爲您的「基本單詞」,例如, afrykanerskojęzyczny
。
注意事項是zdict
僅在Python 3.3及更高版本中受支持,並且如果您對所有差異具有相同的「基本單詞」,則該代碼最容易編碼,而這可能是也可能不是您想要的。
我喜歡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] != ' ']
- 1. 查找兩個字符串之間的多個區別
- 2. 兩個字符串之間的區別mysql
- 3. VBScript中兩個字符串之間的區別
- 4. 檢查空字符串的兩種方法之間的區別
- 5. 字符串創建:兩種語法「和」之間的區別?
- 6. @string和@ +字符串之間的區別?
- 7. 字符串之間的區別
- 8. 字符串和AttributedString之間的區別
- 9. 字符串插值和字符串串聯之間的區別
- 10. 兩個字符串之間
- 11. 字符串[]和[字符串]之間的區別
- 12. 聲明字符串和分配字符串之間的區別
- 13. 字符串和字符串C之間的區別#
- 14. 空字符串和空字符串之間的區別
- 15. std :: string,字符串val和字符串之間的區別val =「」
- 16. 「\(字符串)」和字符串之間的區別?
- 17. 識別字符串中的字符串兩者之間在iphone
- 18. 兩個時間戳之間的區別
- 19. 兩個時間項之間的區別
- 20. 兩個字符串有什麼區別?
- 21. 字符串X,Y之間的區別;和字符串X,字符串Y;
- 22. 二進制字符串,字節字符串,unicode字符串和普通字符串(str)之間的區別
- 23. 顯示C中的2個char *字符串之間的區別
- 24. 刪除字符串之間的兩個符號之間的字符串
- 25. 如何找到兩個日期時間字符串的區別?
- 26. PL/SQL中兩個無序分隔字符串之間的區別
- 27. 什麼是這兩個字符串數組之間的區別命令
- 28. Python:兩個字符之間的分割
- 29. 2個正則表達式字符串之間的區別
- 30. 提取Haskell中兩個子字符串之間的字符串
你的**意思「恢復第二個字符串從第一個和差異「?** – jrd1
我相信他的意思是」使第二個字符串與第一個相同「。 –
@EliasBenevedes,正好:)。 – user2626682