3

したがって、私はこのメソッドを使用しています。これは、数値の検索に関しては正常に機能しますが、最後の値のみを返します。各実行後にすべての値を返すようにする方法はありますか。ここに私のコードがあります:

def searchPFAM():

    fileAddress = '/Volumes/interpro/data/Q14591.txt'
    start = None
    end = None
    with open(fileAddress,'rb') as f:
        root = etree.parse(f)
        for lcn in root.xpath("/protein/match[@dbname='PFAM']/lcn"):#find dbname =PFAM
            start = int(lcn.get("start"))#if it is PFAM then look for start value
            end = int(lcn.get("end"))#if it is PFAM then also look for end value
            print start, end
        return start, end
4

3 に答える 3

5

これに似た意味ですか?

def do_something(fname):
    with open(fname,'rb') as f:
        root = etree.parse(f)
        for lcn in root.xpath("/protein/match[@dbname='PFAM']/lcn"):#find dbname =PFAM
            # Make slightly more robust
            try:
                start = int(lcn.get("start"))#if it is PFAM then look for start value
                end = int(lcn.get("end"))#if it is PFAM then also look for end value
                yield start, end
            except (TypeError , ValueError) as e:
                pass # start/end aren't usable as numbers decide what to do here...

for start, end in do_something():
    do_something_else(start, end)
于 2012-07-12T17:24:39.733 に答える
0

関数を変更して、開始と終了のタプルのリストを作成して返すだけです。

def searchPFAM():
    fileAddress = '/Volumes/interpro/data/Q14591.txt'
    start = None
    end = None
    result = []
    with open(fileAddress,'rb') as f:
        root = etree.parse(f)
        for lcn in root.xpath("/protein/match[@dbname='PFAM']/lcn"):#find dbname =PFAM
            start = int(lcn.get("start"))#if it is PFAM then look for start value
            end = int(lcn.get("end"))#if it is PFAM then also look for end value
            print start, end
        result.append((start, end))
    return result

少し読みにくいですが、よりコンパクトで効率的な方法は、「リスト内包表記」として知られているものを使用することです。次のようになります。

def searchPFAM():
    fileAddress = '/Volumes/interpro/data/Q14591.txt'
    start = None
    end = None
    with open(fileAddress,'rb') as f:
        root = etree.parse(f)
        result = [(int(lcn.get("start")), int(lcn.get("end"))) 
                     for lcn in root.xpath("/protein/match[@dbname='PFAM']/lcn")]
    return result

その後、返されたリストを次のように処理できます。

for start,end in result:
   ... # do something with pair of int values

また

for i in xrange(len(result)):
   start,end = result[i][0],result[i][1]
   ... # do something with pair of int values
于 2012-07-12T17:30:46.040 に答える
0

start と end のタプルのリストを作成し、関数の最後でリストを返すだけです。

于 2012-07-12T17:24:45.870 に答える