0

2行目にシーケンスがあり、トークナイザーと呼ばれる変数を持つファイルがあり、古い位置の値が得られます。新しい位置を見つけようとしています..たとえば、この行のトークナイザーは、12 までの文字のみを数えることで E である位置 12 を提供します。したがって、ダッシュを数えて新しい位置を把握する必要があります...

---------------LL---NE--HVKTHTEEK---PF-ICTVCR-KS----------

これは私がこれまでのところ持っているもので、まだ機能しません。

with open(filename) as f:
    countletter = 0
    countdash = 0
    for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
        tokenizer=line.split()[4]
        print tokenizer

        for i,character in enumerate(line2):

            for countletter <= tokenizer:

                if character != '-': 
                    countletter += 1
                if character == '-':
                    countdash +=1

この例では、新しい位置は 32 になるはずです

4

3 に答える 3

1

最初の回答、チャド D によって編集され、インデックスが 1 になるようにしました (ただし、正しくありません)。

def get_new_index(string, char_index):
    chars = 0
    for i, char in enumerate(string):
        if char != '-':
            chars += 1
        if char_index == chars:
            return i+1

書き直したバージョン:

import re

def get(st, char_index):
    chars = -1
    for i, char in enumerate(st):
        if char != '-':
            chars += 1
        if char_index == chars:
            return i

def test():
    st = '---------------LL---NE--HVKTHTEEK---PF-ICTVCR-KS----------'
    initial = re.sub('-', '', st)
    for i, char in enumerate(initial):
        print i, char, st[get_1_indexed(st, i)]

def get_1_indexed(st, char_index):
    return 1 + get(st, char_index - 1)

def test_1_indexed():
    st = '---------------LL---NE--HVKTHTEEK---PF-ICTVCR-KS----------'
    initial = re.sub('-', '', st)
    for i, char in enumerate(initial):
        print i+1, char, st[get_1_indexed(st, i + 1) - 1]
于 2012-07-30T21:16:52.117 に答える
0

私の元のテキストはこのようになり、私が興味を持っていた位置は「E」である12でした

実際には、ゼロのインデックス付き文字列を使用していると仮定すると、それは K です。Python はゼロ インデックスを使用するため、フープを介して 1 インデックスのものにジャンプしない限り (そうでない場合)、K が返されます。問題が発生した場合は、これに対処してみてください。

必要なことを実行するコードを次に示します (ただし、1 インデックスではなく 0 インデックスを使用します)。これはオンラインで見つけることができます

def get_new_index(oldindex, str):
    newindex = 0

    for c in str:
        if c != '-':
            if oldindex == 0:
                return newindex
            oldindex -= 1
        newindex += 1

    return 1 / 0 # throw a shitfit if we don't find the index
于 2012-07-30T21:20:50.753 に答える
0

これは 2 行目を取得する愚かな方法です。islice を使用する方が明確です。next(f)

for line, line2 in itertools.izip_longest(f, f, fillvalue=''):

ここcount_letterintしばらくの間のようtokenizerですstr。おそらくあなたが期待するものではありません。

    for countletter <= tokenizer:

これも構文エラーなので、実行しているコードではないと思います

おそらくあなたは持っているべきです

tokenizer = int(line.split()[4]) 

tokenizerするint

print tokenizerとは同じように見えるためint、誤解を招く可能性があります。デバッグ時に代わりにstr試してください。print repr(tokenizer)

トークナイザーがintであることを確認したら、この行を変更できます

    for i,character in enumerate(line2[:tokenizer]):
于 2012-07-30T21:46:04.863 に答える