【问题标题】:function for suffix array python后缀数组python的函数
【发布时间】:2019-07-05 15:23:14
【问题描述】:

我想写一个输出后缀数组的函数。这是我目前所拥有的:

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]

【问题讨论】:

  • 输出中的每个数字代表什么?
  • 您的问题并不完全清楚。显然您正在寻找输出后缀数组的索引,而不是实际的后缀数组?这看起来像 `['a', 'ana', 'anana', 'banana', 'na', 'nana']。

标签: python sorting suffix-array suffix


【解决方案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]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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]
      

      【讨论】:

        【解决方案4】:
        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]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          • 1970-01-01
          • 2017-08-15
          • 2011-01-15
          相关资源
          最近更新 更多