0

次の形式のテキスト ファイルがあります。

AAAAATTTTTT
AAATTTTTTGGG
TTTDDDCCVVVVV

行頭と行末で順番に文字の出現回数を計算しようとしています。

私は次の関数を書きました:

def getStartEnd(sequence):
    start = sequence[0]
    end = sequence[-1]
    startCount = 0
    endCount = 0

    for char in sequence:
        if char == start:
            startCount += 1
            if ( char != start):
                break

    for char in reversed(sequence):
        if char == end:
            endCount += 1
            if ( char != end):
                break

    return startCount, endCount

この関数は、文字列に対して独立して機能します。例:

seq = "TTTDDDCCVVVVV"
a,b = getStartEnd(seq)
print a,b

しかし、for ループに挿入すると、ファイルの最後の行でのみ正しい値が得られます。

file = open("Test.txt", 'r')

for line in file:
    a,b = getStartEnd(str(line))
    print a, b
4

2 に答える 2

3

最後の行以外の行には改行が含まれているためです。

以下を試してください(末尾のスペースを取り除きます):

with open("Test.txt", 'r') as f:
    for line in f:
        a, b = getStartEnd(line.rstrip())
        print a, b

ところで、( char != end )次のコードでは常に False です。( も同様( char != start))

for char in reversed(sequence):
    if char == end:
        endCount += 1
        if ( char != end): # always False because char == end
            break

これのことですか?

for char in reversed(sequence):
    if char == end:
        endCount += 1
    else:
        break

使用方法itertools.takewhile

import itertools

def getStartEnd(sequence):
    start = sequence[0]
    end = sequence[-1]
    start_count = sum(1 for _ in itertools.takewhile(lambda ch: ch == start, sequence))
    end_count = sum(1 for _ in itertools.takewhile(lambda ch: ch == end, reversed(sequence)))
    return start_count, end_count
于 2013-10-03T05:37:04.983 に答える
1

三つのこと。まず、あなたの関数では、おそらくbreak次の構造を使用するつもりでした。

for char in sequence:
    if char == start:
        startCount += 1
    else:
        break

for char in reversed(sequence):
    if char == end:
        endCount += 1
    else:
        break

次に、ファイル内の行をループする場合、str関数を使用して行を文字列に変換する必要はありません。それらはすでに文字列です。

第 3 に、行には次のような改行文字が含まれています。改行文字は'\n'、行を終了して新しい行を開始するタイミングをコンピューターに伝えるために使用されます。それらを取り除くには、rstrip次のように文字列のメソッドを使用できます。

file = open("Test.txt", 'r')

for line in file:
    a,b = getStartEnd(line.rstrip())
    print a, b
file.close()
于 2013-10-03T05:43:09.390 に答える