如何编写一个方法来计算 ruby​​ 中字符串中最常见的子字符串?

2023-12-02

我的这个程序带有阶级 DNA。该程序计算字符串中最常见的 k 聚体。因此,它正在寻找长度为 k 的字符串中最常见的子字符串。

一个示例是使用 AACCAATCCG 字符串创建 dna1 对象。 count k-mer 方法将查找长度为 k 的子串并输出最常见的答案。因此,如果我们设置 k = 1,那么“A”和“C”将是字符串中出现次数最多的,因为它出现了四次。请参阅下面的示例:

 dna1 = DNA.new('AACCAATCCG')
=> AACCAATCCG
>> dna1.count_kmer(1)
=> [#<Set: {"A", "C"}>, 4]
>> dna1.count_kmer(2)
=> [#<Set: {"AA", "CC"}>, 2]

这是我的 DNA 课程:

   class DNA
      def initialize (nucleotide)
        @nucleotide = nucleotide
      end
      def length
        @nucleotide.length
      end   
      protected
 attr_reader :nucleotide
end

这是我正在尝试实现的 count kmer 方法:

# I have k as my only parameter because I want to pass the nucleotide string in the method
def count_kmer(k)

# I created an array as it seems like a good way to split up the nucleotide string.
  counts = []

  #this tries to count how many kmers of length k there are
  num_kmers = self.nucleotide.length- k + 1

  #this should try and look over the kmer start positions
  for i in num_kmers

    #Slice the string, so that way we can get the kmer
    kmer = self.nucleotide.split('')
  end

  #add kmer if its not present
  if !kmer = counts
    counts[kmer] = 0

    #increment the count for kmer
    counts[kmer] +=1 
  end

  #return the final count
return counts
end

#end dna class
end

我不知道我的方法哪里出了问题。


像这样的东西吗?

  require 'set'

  def count_kmer(k)
    max_kmers = kmers(k)
                    .each_with_object(Hash.new(0)) { |value, count| count[value] += 1 }
                    .group_by { |_,v| v }
                    .max
    [Set.new(max_kmers[1].map { |e| e[0] }), max_kmers[0]]
  end

  def kmers(k)
    nucleotide.chars.each_cons(k).map(&:join)
  end

编辑:这是课程的全文:

require 'set'

class DNA
  def initialize (nucleotide)
    @nucleotide = nucleotide
  end

  def length
    @nucleotide.length
  end

  def count_kmer(k)
    max_kmers = kmers(k)
                    .each_with_object(Hash.new(0)) { |value, count| count[value] += 1 }
                    .group_by { |_,v| v }
                    .max
    [Set.new(max_kmers[1].map { |e| e[0] }), max_kmers[0]]
  end

  def kmers(k)
    nucleotide.chars.each_cons(k).map(&:join)
  end

  protected
  attr_reader :nucleotide
end

这将使用 Ruby 2.2.1、使用您指定的类和方法生成以下输出:

>> dna1 = DNA.new('AACCAATCCG')
=> #<DNA:0x007fe15205bc30 @nucleotide="AACCAATCCG">
>> dna1.count_kmer(1)
=> [#<Set: {"A", "C"}>, 4]
>> dna1.count_kmer(2)
=> [#<Set: {"AA", "CC"}>, 2]

作为奖励,您还可以执行以下操作:

>> dna1.kmers(2)
=> ["AA", "AC", "CC", "CA", "AA", "AT", "TC", "CC", "CG"]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写一个方法来计算 ruby​​ 中字符串中最常见的子字符串? 的相关文章

随机推荐

  • 桌面 TCP 流式传输 (java)

    我想串流桌面屏幕截图使用套接字 我不知道具体的方法 所以我使用了 AWT 的机器人 Robot robot new Robot BufferedImage image robot createScreenCapture screenRect
  • 使用 PYODBC 将 pandas 中的数据获取到 SQL Server

    我试图了解 python 如何将数据从 FTP 服务器提取到 pandas 中 然后将其移动到 SQL 服务器中 至少可以说 我这里的代码非常初级 我正在寻求任何建议或帮助 我尝试先从 FTP 服务器加载数据 效果很好 如果我然后删除此代码
  • apk 必须使用与之前版本相同的证书进行签名

    我不久前已将我的应用程序上传到 Google Play 当时称为 Android Market 今天我更新了应用程序 但我删除了以前的密钥库并创建了一个新的 上传时 它说 APK 必须使用与以前版本相同的证书进行签名 上传失败 您上传的 A
  • 将文件的全部内容读取到 c char *,包括新行

    我正在寻找一种跨平台 Windows Linux 解决方案来将整个文件的内容读取到char 这就是我现在所拥有的 FILE stream char contents fileSize 0 Open the stream stream fop
  • 如何在 Fluent NHibernate 中映射受保护的集合?

    我尝试过在 Fluent 中使用 Reveal 属性 但无法将其与集合一起编译 我希望实体中的我的集合之一受到保护 并且除了实体本身之外 无法在任何地方访问 这可能吗 谢谢 Edit 这是我尝试使用的代码 HasMany
  • 增加Tomcat内存设置[重复]

    这个问题在这里已经有答案了 可能的重复 处理 java lang OutOfMemoryError PermGen space 错误 我的开发机器中有 8GB RAM 并且正在尝试运行 Apache Tomcat 7 0 29 来托管这两个
  • 签入 ClearCase 失败

    我正在尝试将文件添加到 ClearCase 中 但收到以下错误 将 C PATH file dbc 添加到源代码管理时出错 更改了 C PATH file dbc 的保护 创建分支 C PATH file dbc 版本 main 0 类型管
  • 通过 API 获取 YouTube 用户的完整播放列表列表

    因此 这是我获取 YouTube 用户的公共播放列表的代码 function getyoutubeplaylists userName yt connectyoutube yt gt setMajorProtocolVersion 2 pl
  • Apple Wallet 无法自动更新通行证

    最后我能够推送新的更改的编译包 为了看到新的变化 我面临一个问题 我必须进入我的钱包卡并禁用 自动更新 然后启用 然后我就可以看到我新编译的通行证 result pdo gt query query if result gt rowCoun
  • 无法编译《C 编程语言 2nd》第 29 页的示例代码

    无法编译 C 编程语言 第二版第 29 页上的代码 我变了 getline to GetLine 在代码中使其工作 我们怎样做才能让程序在不改变的情况下编译呢 作者是如何编译代码的 这是代码 include
  • 以编程方式关闭点击键盘声音 (iOS)

    有什么方法可以禁用用户在键盘上打字时的声音 如果您使用的是官方 iOS SDK 则不会 可能可以使用私有框架 但如果您使用它们 您的应用程序将不会被批准在 iTunes App Store 上销售
  • PyCharm 中的子包和相对导入

    我正在使用Python 2 python version Python 2 7 13 Continuum Analytics Inc 我有以下项目结构 foo bar1 init py mod1 py bar2 init py mod2 p
  • 内联函数有一个非内联副本

    在阿格纳 雾的优化C 手册他有一节 内联函数有一个非内联副本 他在其中写道 函数内联的复杂之处在于可能从另一个模块调用相同的函数 编译器必须制作内联函数的非内联副本 以便该函数也可能从另一个模块调用 如果没有其他模块调用该函数 则该非内联副
  • 如何从 JSON 流中删除特殊字符,以便我可以使用 gson API 将 JSON 对象转换为 JAVA 对象?

    我正在尝试使用 Google gson API 将 JSON 对象序列化为 java 对象 我需要从此流中删除特殊字符以进行序列化 我该如何实现这一目标 这是我从请求中获取的 JSON 对象 color 北极白 imageUrl http
  • 将选定的列从 CSV 文件导入到 SQL Server 表

    我正在尝试将数据从 CSV 文件导入到 SQL Server 2008 表 数据上传正在工作 但我只想导入选定的列 而不是全部 并将它们添加到具有相同编号的新表中 使用向导 但它没有发生 向导正在选择所有列 那么是否可以使用向导仅导入选定的
  • R 中匹配整个字符串

    考虑以下字符串 string I have 1 file and 11 folders 我想更换图案 1用这个词one 但我不想修改 11 结果应该是 string I have one file and 11 folders 我努力了 s
  • 在 C/C++ 中创建 10 位数据类型 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 可以创建10位数据类型吗 我可以用uint16 t uint32 t等等 但是如果我想使用怎么办uint10 t or uint12 t 这可能吗 您不能拥有大小不是字节倍数的类
  • Chrome console.log(elementID) 在控制台中输出元素

  • 如何从 Outlook 联系人中获取列中列出的姓名的电子邮件地址?

    我是 VBA 新手 我需要帮助做一些事情 如下图所示 我有一个名字列表 我想要做的是根据 A 列中的姓名从 Outlook 联系人列表中检索他们的电子邮件地址 电子邮件地址分散在不同的联系人文件夹中 并将其粘贴到 B 列中 或者 是否可以从
  • 如何编写一个方法来计算 ruby​​ 中字符串中最常见的子字符串?

    我的这个程序带有阶级 DNA 该程序计算字符串中最常见的 k 聚体 因此 它正在寻找长度为 k 的字符串中最常见的子字符串 一个示例是使用 AACCAATCCG 字符串创建 dna1 对象 count k mer 方法将查找长度为 k 的子