【问题标题】:Finding the rating of words using python使用python查找单词的评分
【发布时间】:2013-03-19 19:46:29
【问题描述】:

这是我的程序,如果我给出完整的名称(例如输入eng),它会显示值,而不是只显示带有值的eng

import re
sent = "eng"
#sent=raw_input("Enter word")
#regex = re.compile('(^|\W)sent(?=(\W|$))')
for line in open("sir_try.txt").readlines():
    if sent == line.split()[0].strip():
        k = line.rsplit(',',1)[0].strip()
        print k
gene name        utr length
ensbta                  24
ensg1                   12
ensg24                  30
ensg37                  65
enscat                  22
ensm                    30

实际上我想要做的是我想搜索highest value from the text file 而不是通过单词,它会删除文本文件中相同单词的所有值,其值小于上面文本中的最大值删除 12 , 30 的 ensg ,而不是 it should find the minimum value from the utr values and display it with name 你们的回答是,我已经做到了,我在展示我的程序之前提到了它

【问题讨论】:

  • 那么,您只想保留一个包含ensg 的“序列”,即另一个字段中具有最大值的序列??
  • 我只是希望,如果想要的话,它会给我从 ensg37 的 65 之类的最大值作为上面 txt 文件的结果,它应该检查数字,然后显示该数字的字符串
  • 我已经添加了删除部分,看看是否有帮助。

标签: python regex python-2.7


【解决方案1】:

请试试这个

file=open("sir_try.txt","r")
list_line=file.readlines()
file.close()
all_text=""

dic={}
sent="ensg"
temp_list=[]
for line in list_line:
    all_text=all_text+line
    name= line.rsplit()[0].strip()
    score=line.rsplit()[1].strip()
    dic[name]=score
for i in dic.keys():
    if sent in i:
        temp_list.append(dic[i])
hiegh_score=max(temp_list)

def check(index):
    reverse_text=all_text[index+1::-1]
    index2=reverse_text.find("\n")
    if sent==reverse_text[:index2+1][::-1][1:len(sent)+1]:
        return False
    else:
        return True

list_to_min=dic.values()
for i in temp_list:
    if i!=hiegh_score:
        index=all_text.find(str(i))
        while check(index):
            index=all_text.find(str(i),index+len(str(i)))
        all_text=all_text[0:index]+all_text[index+len(str(i)):]
        list_to_min.remove(str(i))
#write all text to "sir_try.txt"
file2=open("sir_try.txt","w")
file2.write(all_text)
file2.close()
min_score= min(list_to_min)
for j in dic.keys():
    if min_score==dic[j]:
        print "min score is :"+str(min_score)+" for person "+j

功能检查是针对独奏中的错误,以解释您的文件何时

gene name        utr length
ali                     12
ali87                   30
ensbta                  24
ensg1                   12
ensg24                  30
ensg37                  65
enscat                  22
ensm                    30

程序删除阿里分数,但我们没有它
通过添加检查功能我解决了它
这个版本是最终版本的答案

【讨论】:

  • 它应该从 utr 值中找到最小值并用名称显示它
【解决方案2】:

尝试代替 if sent == 并将其替换为 if sent in (line.split()[0].strip()):

在这种情况下,应该检查 sent (engs) 的值是否在参数 (line.split()[0].strip()) 中的任何位置。

如果你仍然试图只取最高值,我会创建一个变量值,然后类似于

if line.split()[1].strip() > value:
    value = line.split()[1].strip()

测试一下,让我们知道它是如何为您工作的。

【讨论】:

  • if line.split[1].strip() > value: TypeError: 'builtin_function_or_method' object has no attribute '__getitem__' 使用函数if line.split[1].strip() > value: value = line.split[1].strip()
【解决方案3】:

要找出名称(第一列)与关联的最大值(第二列),您需要首先split 名称和值之间的空白处的行。然后您可以使用内置的max() 函数找到最大值。让它以值列作为排序标准。然后,您可以轻松找到相应的名称。

例子:

file_content = """
gene name        utr length
ensbta                  24
ensg1                   12
ensg24                  30
ensg37                  65
enscat                  22
ensm                    30
"""

# split lines at whitespace
l = [line.split() for line in file_content.splitlines()]

# skip headline and empty lines
l = [line for line in l if len(line) == 2]

print l

# find the maximum of second column
max_utr_length_tuple = max(l, key=lambda x:x[1])

print max_utr_length_tuple

print max_utr_length_tuple[0]

输出是:

$ python test.py
[['ensbta', '24'], ['ensg1', '12'], ['ensg24', '30'], ['ensg37', '65'], ['enscat', '22'], ['ensm', '30']]
['ensg37', '65'] 
ensg37

【讨论】:

    【解决方案4】:

    又短又甜:

    In [01]: t=file_content.split()[4:]
    In [02]: b=((zip(t[0::2], t[1::2])))
    In [03]: max(b, key=lambda x:x[1])
    Out[03]: ('ensg37', '65')
    

    【讨论】:

      【解决方案5】:
      import operator
      f = open('./sir_try.txt', 'r')
      f = f.readlines()
      del f[0]
      
      gene = {}
      matched_gene = {}
      
      for line in f:
          words = line.strip().split(' ')
          words = [word for word in words if not word == '']
          gene[words[0]] = words[1]
      
      # getting user input
      user_input = raw_input('Enter gene name: ')
      for gene_name, utr_length in gene.iteritems():
          if user_input in gene_name:
              matched_gene[gene_name] = utr_length
      m = max(matched_gene.iteritems(), key=operator.itemgetter(1))[0]
      print m, matched_gene[m]  # expected answer
      
      # code to remove redundant gene names as per requirement
      
      for key in matched_gene.keys():
          if not key == m:
              matched_gene.pop(key)
      for key in gene.keys():
          if user_input in key:
              gene.pop(key)
      
      final_gene = dict(gene.items() + matched_gene.items())
      out = open('./output.txt', 'w')
      out.write('gene name' + '\t\t' + 'utr length' + '\n\n')
      for key, value in final_gene.iteritems():
          out.write(key + '\t\t\t\t' + value + '\n')
      out.close()
      

      输出:

      Enter gene name: ensg
      ensg37 65
      

      【讨论】:

      • 但它并没有从文本文件中删除 ensg37 的其他值,同一个词的值小于 65
      • 你的答案是基于一个部分,第二部分是 ,` 并且它应该从输出文件 utr 值中找到最小值并用名称显示它 `
      • 您专注于用户输入,而我专注于该用户不应输入值,系统自行检查,通过检查值而不是单词,当我再次强调我的问题时,你们给我我已经做过的事情的答案(大约)
      【解决方案6】:

      既然您已标记您的问题
      这是您希望看到的东西,它是(目前)唯一使用正则表达式的东西!

      import re
      
      sent = 'ensg' # your sequence
      # regex that will "filter" the lines containing value of sent  
      my_re = re.compile(r'(.*?%s.*?)\s+?(\d+)' % sent)
      
      with open('stack.txt') as f:
          lines = f.read() # get data from file
      
      filtered = my_re.findall(lines) # "filter" your data
      print filtered
      
      # get the desired (tuple with maximum "utr length")
      max_tuple = max(filtered, key=lambda x: x[1]) 
      print max_tuple
      

      输出:

      [('ensg1', '12'), ('ensg24', '30'), ('ensg37', '65')]
      ('ensg37', '65')
      

      【讨论】:

        猜你喜欢
        • 2014-09-11
        • 2020-02-02
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        相关资源
        最近更新 更多