2

これは私のプログラムであり、入力した場合のように完全な名前を指定すると値が表示され、値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 あなたが私に答えているのは、私はすでにそれを行っており、私のプログラムを見せる前にそれについて言及しています

4

6 に答える 6

0

これを試してください

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

プログラムはアリスコアを削除しますが
、チェック機能を追加することでそれを持っていません私はそれを解決し
、このバージョンは最終バージョンの回答です

于 2013-03-19T20:17:17.580 に答える
0
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
于 2013-03-19T20:17:36.427 に答える
0

名前 (最初の列) と関連付けられた最大値 (2 番目の列) を見つけるには、最初に名前と値の間の空白で行を分割する必要があります。次に、組み込み関数を使用して最大値を見つけることができます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
于 2013-03-19T20:18:15.137 に答える
0

代わりに試して、if sent ==に置き換えてくださいif sent in (line.split()[0].strip()):

この場合、送信された (engs) の値が引数 (line.split()[0].strip()) のどこかにあるかどうかを確認する必要があります。

それでも最高値のみを取得しようとしている場合は、変数値を作成してから、次の行に沿って何かを作成します

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

それをテストして、それがどのように機能するかをお知らせください.

于 2013-03-19T20:05:20.467 に答える
0

短くて甘い:

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')
于 2013-03-19T20:34:19.973 に答える
0

質問にのタグを付けたので、
ここにあなたが見たいものがあります。正規表現を使用しているのは (現時点では) 唯一のものです!

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')
于 2013-03-20T06:25:10.460 に答える