后缀数组python的函数

时间:2019-02-12 03:13:00

标签: python sorting suffix-array suffix

我想编写一个输出后缀数组的函数。这是我到目前为止的内容:

def suffixArray(s):
    sa = []
    for i in range(len(s)):
        suffix= sorted([s[i:]])
        sa = [len(s)-len(suffix[i:])
    return list(sa)

这会输出一个错误,因为我认为我错过了一个额外的if语句,但是我不确定如何处理它。是的,我知道可能有更简单的方法来获取后缀数组,但是我是python的初学者,可以使用的功能很少。任何帮助表示赞赏。谢谢

这也是我希望输入和输出为以下内容的示例: 输入-> suffixArray('banana') 输出-> [5、3、1、0、4、2]

4 个答案:

答案 0 :(得分:1)

显然,您要按字典顺序对每个后缀进行索引

s = 'banana'
>>> [t[1] for t in sorted((s[i:],i) for i in range(len(s)))]
[5, 3, 1, 0, 4, 2]

或另一种方式:

>>> sorted(range(len(s)), key=lambda i: s[i:])
[5, 3, 1, 0, 4, 2]

答案 1 :(得分:0)

对于一个简单的后缀数组:

s = 'banana'
sa = sorted([s[i:] for i in range(len(s))])

对于后缀索引数组:

s = 'banana'
usd = {i: s[i:] for i in range(len(s))
sai = [x for x, _ in sorted(d.items(), key=lambda x: x[1])]

答案 2 :(得分:0)

首先,生成一个带有后缀对的数组:后缀字符串及其编号:

suffixes = [(s[i:], i) for i in range(len(s))]

接下来,按后缀字符串对该列表进行排序:

suffixes.sort(key=lambda x: x[0])

现在您可以只返回数字:

return [s[1] for s in suffixes]

将它们放在一起:

def suffixArray(s):
    suffixes = [(s[i:], i) for i in range(len(s))]
    suffixes.sort(key=lambda x: x[0])

    return [s[1] for s in suffixes]

答案 3 :(得分:0)

def get_suffix_array(str_sample):
    lis = list(str_sample)
    suffix_array = {v:k for k,v in enumerate(["".join(trim_elem) for trim_elem in [lis[-len(str_sample)+idx:] for idx in range(len(str_sample))]])}
    return [suffix_array.get(k) for k in sorted(list(suffix_array.keys()))]

print(get_suffix_array('banana'))

结果:[5, 3, 1, 0, 4, 2]