Python - 2つの文字列間の差 -- python フィールド と string フィールド と python-3.x フィールド と diff フィールド 関連 問題

Python - difference between two strings












92
vote

問題

日本語

リストにたくさんの単語を保存したいのですが。これらの言葉の多くは非常に似ています。たとえば、私は言葉の afrykanerskojęzyczny を持っているし、<コード> afrykanerskojęzycznym は、<コード> afrykanerskojęzyczni は、<コード> nieafrykanerskojęzyczni のような言葉の多く。 2つの文字列間の差を見つけるための効果的な(高速および与える小さな差分サイズ)ソリューションとは何ですか?

英語

I'd like to store a lot of words in a list. Many of these words are very similar. For example I have word afrykanerskojęzyczny and many of words like afrykanerskojęzycznym, afrykanerskojęzyczni, nieafrykanerskojęzyczni. What is the effective (fast and giving small diff size) solution to find difference between two strings and restore second string from the first one and diff?

</div
           
       
       

回答リスト

115
 
vote

ndiff を使用してください。これ。 1つの文字列を別の文字列に変換するために必要なすべての情報があります。

簡単な例:

<事前> <コード> 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
 

You can use ndiff in the difflib module to do this. It has all the information necessary to convert one string into another string.

A simple example:

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()       

prints:

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 
</div
 
 
       
       
26
 
vote

私はNDIFFの答えが好きですが、変更だけをすべて絞りたいのであれば、次のようなことができます。

<事前> <コード> import difflib case_a = 'afrykbnerskojęzyczny' case_b = 'afrykanerskojęzycznym' output_list = [li for li in difflib.ndiff(case_a, case_b) if li[0] != ' ']
 

I like the ndiff answer, but if you want to spit it all into a list of only the changes, you could do something like:

import difflib  case_a = 'afrykbnerskojęzyczny' case_b = 'afrykanerskojęzycznym'  output_list = [li for li in difflib.ndiff(case_a, case_b) if li[0] != ' '] 
</div
 
 
     
     
3
 
vote

regex module (ファジィセクション)を調べることができます。実際の違いを得ることができるかどうかわかりませんが、少なくともINSERT、DELETE、および置換などのさまざまな種類の変更の数を指定できます。

<事前> <コード> 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'
 

You can look into the regex module (the fuzzy section). I don't know if you can get the actual differences, but at least you can specify allowed number of different types of changes like insert, delete, and substitutions:

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' 
</div
 
 
3
 
vote

あなたが求めているのは、特殊な圧縮形式です。 xdelta3 は、この特定の種類の圧縮のために設計されており、Pythonバインディングがありますが、おそらく取得することができますZLIBを直接使用してください。 zlib.compressobj zlib.decompressobj zlib.decompressobj zlib.decompressobj を「基本単語」に設定してください。 <コード> afrykanerskojęzyczny

警告は<コード> zdict はPython 3.3以降でのみサポートされています。また、すべてのあなたのDiffの場合は同じ「基本単語」がある場合は最も簡単です。 。

 

What you are asking for is a specialized form of compression. xdelta3 was designed for this particular kind of compression, and there's a python binding for it, but you could probably get away with using zlib directly. You'd want to use zlib.compressobj and zlib.decompressobj with the zdict parameter set to your "base word", e.g. afrykanerskojęzyczny.

Caveats are zdict is only supported in python 3.3 and higher, and it's easiest to code if you have the same "base word" for all your diffs, which may or may not be what you want.

</div
 
 
-2
 
vote

元の質問で上記の私のコメントへの答えは、これが彼が望むすべてのものだと思います:

<事前> <コード> loopnum = 0 word = 'afrykanerskojęzyczny' wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni'] for i in wordlist: wordlist[loopnum] = word loopnum += 1

これは次のことをします。

ワードリストのすべての値には、WordListの値を元のコードに設定します。

あなたが単語リストを変更する必要があるという言葉を保証すること、そして元の単語が正しいことを確認するために、このコードを変更する必要があるすべてのコードを置くことだけです。

これが助けに役立つことを願っています!

 

The answer to my comment above on the Original Question makes me think this is all he wants:

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

This will do the following:

For every value in wordlist, set that value of the wordlist to the origional code.

All you have to do is put this piece of code where you need to change wordlist, making sure you store the words you need to change in wordlist, and that the original word is correct.

Hope this helps!

</div
 
 
 
 

関連する質問

5  ソース管理レポに対するVIMDIFF  ( Vimdiff against a source control repo ) 
scmdiff の違いをマークするファイルのバージョンで編集されているファイルをチェックします。変更された行を着色してマークします。変更された行を着色するのではなく、 vimdiff -style splitを使用して変更を表示する方法はありますか? ...

42  テキスト差分アルゴリズム  ( Text difference algorithm ) 
私は2つのテキストファイルを比較してそれらの違いを強調することができるアルゴリズムを必要とし、(より良い!)は意味のある方法で彼らの違いを計算することができます(2つの同様のファイルのように2つの異なるファイルを超える類似性スコアがあるはずです。通常の用語で定...

7  NetBeansのローカルファイルとリモートファイルの比較  ( Comparing local and remote files in netbeans ) 
NetBeansでローカル(FTP)ファイルを比較する方法はありますか? NetBeansでアップロード(およびダウンロード)コマンドがあります。私がやりたいことは、ダウンロードとアップロードを使用しているときに、内蔵比較ツールでローカルバージョンとリモー...

1  ClearCase Snapshot View Pathは、比較時に解決されない  ( Clearcase snapshot view paths not resolving when comparing ) 
私たちは私の仕事でクリアケースを使います、そして私は(Windows XP上で)スナップショットビューの設定をいくつか持っています。ビュー自体が素晴らしいことで動作しているようですが、私のスナップショットビューから任意の要素のバージョンを比較しようとするたびに...

4  Git DiffはTEMPファイルを作成しません  ( Git diff does not create temp files ) 
GITを使用するときは少し変なものを経験しています。私は私の窓7マシンにgitを使っています。 私はいくつかのコードの変更を確認したいと思いましたので、私はgitkを起動して、コミットの中に何が見たのかを確認しました。変更されたファイルのリストには、最初のフ...

8  Perforce保留中のチェンジリスト差分のスクリプト  ( Perforce pending changelist diff script ) 
誰かが共有するようなスクリプトを持っていますか? 入力として保留中のチェンジリスト番号を取ります 統一された差分を出力します(ファイルを追加するファイルを含む) 私は経験から知っています。 「P4 Diff」を介して新しく追加されたファイルを拡大する場合、...

19  'Best' Diffアルゴリズム[閉じる]  ( Best diff algorithm ) 
現在立つにつれて、この質問は私たちのQ&AMPにとって良いフィットではありません。フォーマット。私たちは事実、参考文献、または専門知識によって支持されることを期待していますが、この質問は...

2  git diffに変更されていないファイルを表示します  ( Display unchanged files in git diff ) 
私は2つのブランチのパスをgitと比較してマージの準備をしています。このパスの下のすべてのファイル、および 9988877660 を使用して、変更されたファイルだけでなく、変更されたファイルをリストしたいです。 例: 私は現在、3つのファイルを持っているブラン...

9  Pythonスクリプトでの同様の文書を検出するためのアルゴリズム[閉じる]  ( Algorithm to detect similar documents in python script ) 
ここで尋ねられていることを知るのは難しいです。この問題はあいまい、曖昧で、不完全で、過度に広く、または修辞的であり、現在の形で合理的に回答することはできません。再開できるようにこの質問を...

31  Oracle Diff:2つのテーブルを比較する方法  ( Oracle diff how to compare two tables ) 
は、レイアウトで同じであるが異なるデータを含むことができる2つの表とT2があるとします。 これら2つのテーブルを差し控える最善の方法は何ですか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有