1

比較関数では、基本的に、長いバイナリオブジェクト(たとえば、aaaAAAbbbBBB)内のパターン(たとえば、「AAA」)を探しています。

私はファイルを逆方向​​に処理しており(一致が最初よりも最後に近いことを知っています)、一致がチェックされている変数に1バイトを追加します。

1. aaaAAAbbbBB[B]
2. aaaAAAbbbB[BB]
3. aaaAAAbbb[BBB]
4. aaaAAAbb[bBBB]
5. ... 
n. aaa[AAAbbbBBB] 

一致が見つかりました、オフセット= -n

パターンの長さが3要素であることがわかっているので、検索変数をインクリメントするのではなく、単純にウィンドウ化できるかどうか疑問に思いました。一致がリストの深さ+ 1,000,000要素になると、非常に遅くなります。同じデータのウィンドウ表示は次のようになります。 :

1. aaaAAAbbb[BBB]
2. aaaAAAbb[bBB]B
3. aaaAAAb[bbB]BB
4. aaaAAA[bbb]BBB
5. ...
n. aaa[AAA]bbbBBB

一致が見つかりました、オフセット= -n

私の現在の検索は次のようになります。

if marker in f_data[-counter:]:
    offset = (len(f_data)-counter)+len(marker)
    return offset

MATLABでは、配列のアドレス指定を使用して配列内を移動します(たとえば、window = a [5:8]、window = a [4:7]などを呼び出します)が、Python(2.7)ではそれが不可能だと思います。

スライディングウィンドウを使用するためのいくつかの提案を見ることができます(Pythonのローリングまたはスライディングウィンドウイテレータ-これは厳密に一致しているように見えます)が、実装方法がわからないか、方法がわからないライブラリを参照しています使用する。

これを行うための組み込み関数はありますか?

4

3 に答える 3

5

rfind()またはを使用しないのはなぜrindex()ですか?

haystack = "aaaAAAbbbBBB"
needle   = "AAA"

pos = haystack.rfind(needle)

if pos >= 0:
    print "found at", pos - len(haystack)
else:
    print "not found"
于 2012-09-26T01:29:25.473 に答える
0

2つのこと:

(1)標準の文字列タイプはバイトを保持し、これで正規表現を使用できます。オブジェクトを文字列に丸呑みして、正規表現検索を実行することをお勧めします。

(2)難しい方法でやりたい場合は、http://docs.python.org/library/itertools.html#itertools.groupbyがあります。

于 2012-09-26T01:28:57.033 に答える
0

これは、あなたが言及したwindow()イテレータ関数を利用していると思います。

>>> l = "ABCABACAAASSD"
>>> from itertools import islice
>>>
>>> def window(seq, n=2):
...     "Returns a sliding window (of width n) over data from the iterable"
...     "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
...     it = iter(seq)
...     result = tuple(islice(it, n))
...     if len(result) == n:
...         yield result
...     for elem in it:
...         result = result[1:] + (elem,)
...         yield result
...
>>>
>>> data = [c for c in l] # get each byte/charactor as separate item in list
>>> data
['A', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'A', 'A', 'S', 'S', 'D']
>>> for idx, elements in enumerate(window(reversed(data), n=3)):
...     section = "".join(elements)
...     if section == "AAA":
...         print "found at {}!".format(idx)
...
found at 3!
>>>

説明する:

  • reversed()リストを受け取り、要素を逆の順序で含むイテレータを返します
  • window()反復可能なオブジェクト(リスト、タプル、イテレータ)を受け取り、n要素の数を返し、一度に1つの要素のインデックスをシフトします。
  • enumerate()iterableを取り、単にカウンターをアタッチするので、カウンター/位置と指定された要素アイテムを返します。
于 2012-09-26T01:40:09.473 に答える