【问题标题】:Counting multiple letter groups in a string计算字符串中的多个字母组
【发布时间】:2016-07-25 21:56:00
【问题描述】:

我一直在尝试调整我的 python 函数来计算字母组而不是单个字母,但我遇到了一些麻烦。这是我必须计算单个字母的代码:

my_seq = "CTAAAGTCAACCTTCGGTTGACCTTGAAAGGGCCTTGGGAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTT"

def count_letters(str):
    counts = {}
    for c in str:
        if c in counts:
            counts[c]+=1
        else:
            counts[c]=1
    return counts

counts = count_letters(my_seq)
print(counts)

该函数当前会为每个单独的字母输出计数。现在它打印这个:

{'C': 23, 'T': 30, 'G': 30, 'A': 20}

理想情况下,我希望它打印如下内容:

{'CTA': 2, 'TAG': 3, 'CGC': 1, 'GAG': 2 ... }

我对 python 很陌生,事实证明这很困难。

【问题讨论】:

  • 你要计算的单词列表在哪里?
  • @IronFist 我只想计算所有 3 个字母的组。有没有办法让代码在不定义特定组的情况下做到这一点?
  • 只是为我们的朋友搜索引擎拼写出来,这是在长度为 n 的所有子序列上寻找一个滑动窗口(在本例中 n=3)。

标签: python string function count


【解决方案1】:

这可以使用collections.Counter 快速完成。

from collections import Counter

s = "CTAACAAC"

def chunk_string(s, n):
    return [s[i:i+n] for i in range(len(s)-n+1)]

counter = Counter(chunk_string(s, 3))
# Counter({'AAC': 2, 'ACA': 1, 'CAA': 1, 'CTA': 1, 'TAA': 1})

编辑:详细说明chunk_string:

它将字符串s 和块大小n 作为参数。每个s[i:i+n] 是字符串的一个片段,长度为n 个字符。循环遍历可以对字符串进行切片的有效索引(0 到 len(s)-n)。然后将所有这些切片分组在列表推导中。一个等效的方法是:

def chunk_string(s, n):
    chunks = []
    last_index = len(s) - n
    for i in range(0, last_index + 1):
        chunks.append(s[i:i+n])
    return chunks

【讨论】:

  • 很好,你能解释一下返回线是做什么的吗?
  • 看起来不错。有什么办法可以让它打印成字典(前面没有“计数器”)?或者,有没有办法在不从集合中导入的情况下做到这一点?谢谢。
  • @user3723011 如果需要,您可以将其转换回字典:dict(counter)。
  • @user3723011 而且,如果您不想从collections 导入,您可以使用chunk_string 中提供的方法来迭代当前代码中的子字符串。
  • @JaredGoguen 谢谢!
【解决方案2】:

这基本上是Jared Goguen 发布的第一个答案,但为了回复 OP 的评论,这是一种无需导入模块的可能方式:

>>> m
'CTAAAGTCAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTTGGGGATGACCCTTGGGTCTAAAGTCAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTT'
>>> l = [m[i:i+3] for i in range(len(m)-2)]
>>> 
>>> d = {}
>>> 
>>> for k in set(l):
        d[k] = l.count(k)


>>> d
{'AAG': 4, 'GGA': 1, 'AAA': 2, 'TAA': 4, 'AGG': 4, 'AGT': 2, 'GGG': 7, 'ACC': 5, 'CGG': 2, 'GGT': 7, 'TCC': 2, 'TGA': 5, 'CAA': 2, 'TGG': 2, 'GTC': 3, 'AAC': 2, 'ATG': 1, 'CTT': 5, 'TCA': 2, 'CCT': 7, 'CCC': 3, 'GTT': 6, 'TTG': 6, 'GAT': 1, 'GAC': 3, 'TCG': 2, 'GAG': 2, 'CTA': 4, 'TTC': 4, 'TCT': 1}

或者如果你是一个班轮的粉丝:

>>> d = {k:l.count(k) for k in set(l)}

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多