Python - 通过二进制对象进行 "windowed"迭代?

标签 python iterator

在一个比较函数中,我基本上是在一个长二进制对象(例如,aaaAAAbbbBBB)中寻找一个模式(例如“AAA”)

我正在反向处理文件(我知道匹配比开始更接近结尾),向正在检查匹配的变量添加 1 个字节:

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

找到匹配项,偏移量 = -n

鉴于我知道我的模式有 3 个元素长,我想知道我是否可以简单地窗口化搜索变量而不是递增它 - 当匹配在列表中有 +1,000,000 个元素时它变得非常慢 - 相同的窗口化 View 数据将是:

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)

我可以看到一些使用滑动窗口的建议,(Rolling or sliding window iterator in Python - 这看起来很接近)但我看不到如何实现它或者它们引用了我不知道如何使用的库.

是否有内置函数可以执行此操作?

最佳答案

为什么不直接使用 rfind()rindex()

haystack = "aaaAAAbbbBBB"
needle   = "AAA"

pos = haystack.rfind(needle)

if pos >= 0:
    print "found at", pos - len(haystack)
else:
    print "not found"

关于Python - 通过二进制对象进行 "windowed"迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12593312/

相关文章:

python - Django 没有为模型创建数据库表(无论是 syncdb 还是 South)

python - 检查某个值在时间范围内是否超过阈值的最佳方法

python - 无法将 python datetime.date 对象与 sqlite DATE 匹配

java - 迭代器打印链表

python - 如何获得 "scoring"训练模型(预测)

c++ - 如何跟踪 C++ vector 上的当前和上一个迭代器?

c++ - 我是否暴露了太多的迭代器?

c++ - 我该如何修复错误 : conversion from ‘void’ to non-scalar type ‘std::vector<int>’ requested

java - 为什么此代码不会导致 ConcurrentModificationException?

python - 按特定类名称选择元素