【问题标题】:Count values for strings that appear consecutively计算连续出现的字符串的值
【发布时间】:2020-05-06 06:08:16
【问题描述】:

我有一个名为 seq 的文本字符串,其值如下:AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM

现在我还有一个存储这些字符串的值列表:['AATTD','AGAT','MMM']。 我试图用我的代码实现的是计算列表中每个单词(不是每个字母)出现在文本中的次数 consecutively 并将字符串的计数值存储在字典中。

当我连续说时,这意味着在上面这部分文本中,AATTDYAATTDUUAATTDAATTDAATTD,值 AATD 的计数应该只有 3,因为其他 2 分别由 YUU 分隔。

到目前为止,这是我对代码所做的:

count = 0
list1 = ['AATTD','AGAT','MMM']
length = len(list1) # The length of the list 
print(length)

seq = open(filepath, "r") # open the file that has the string of text
seq = seq.read()

for i in range(len(seq)):
    for j in list1:
        while (seq[i:len(j)]  == len(j) ):
            if seq[i:len(j)]  == j:
                count += 1
    print (j, count)

但这似乎打印了所有 0 作为计数的每个字符串。谁能帮我解决这个问题?谢谢!

【问题讨论】:

    标签: python python-3.x string list for-loop


    【解决方案1】:

    一种使用re.findall的方式:

    {t: len(re.findall("(({})+)".format(t), seq)[-1][0])/len(t) for t in list1}
    

    输出:

    {'AATTD': 3.0, 'AGAT': 2.0, 'MMM': 3.0}
    

    【讨论】:

      【解决方案2】:

      如果我正确理解期望的结果,可以按如下方式实现:

      代码:

      list1 = ['AATTD','AGAT','MMM']
      
      seq = "AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM"
      
      d = dict()
      
      for s in list1:
          c = 1
          while s*c in seq:
              c += 1
          print(s, c-1)
          d[s] = c-1
      

      输出:

      AATTD 3
      AGAT 2
      MMM 3
      >>> d
      {'AATTD': 3, 'AGAT': 2, 'MMM': 3}
      

      另请注意,从文件中读取时,您应该使用:

      with open(filepath, "r") as f:
          seq = f.read()
      

      避免阅读后忘记关闭文件的问题。

      【讨论】:

        【解决方案3】:

        在python中使用正则表达式默认包re。

        import re
        
        list1 = ['AATTD','AGAT','MMM']
        
        seq = open(filepath, "r") # open the file that has the string of text
        seq = seq.read()
        
        for word in list1:
        
             # WITHOUT CASE SENSITIVE
             print(word,len(re.findall(word,seq)))
        
             # WITH CASE SENSITIVE SEARCH
             print(word,len(re.findall(word,seq,re.IGNORECASE)))
        

        回复文档:https://docs.python.org/3/library/re.html

        【讨论】:

          【解决方案4】:

          请注意此代码效率不高,如果您的文本包含以下符号:

          $ ^ * ? \ ( ) { } [ ] +

          import re
          
          seq = "AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM"
          list1 = ['AATTD','AGAT','MMM']
          
          for word in list1:
              list2 = re.findall("(?:%s)+" % word, seq)
              longest = len(max(list2, key=len))
              print(int(longest/len(word)))
          

          输出:

          3
          2
          3

          【讨论】:

            猜你喜欢
            • 2021-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-30
            • 1970-01-01
            相关资源
            最近更新 更多