0

我有一个在第 2 行有序列的文件和一个名为 tokenizer 的变量,它给了我一个旧的位置值。我正在尝试找到新位置.. 例如,这条线的标记器给我位置 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

第一个答案,由 Chad D 编辑,使其成为 1-indexed(但不正确):

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

我的原文看起来像这样,我感兴趣的位置是 12,即 'E'

实际上,它是 K,假设您使用的是零索引字符串。Python 使用零索引,所以除非你跳过箍到 1 索引的东西(你不是)它会给你 K。如果你遇到问题,试着解决这个问题。

这里有一些代码可以满足您的需要(尽管使用 0 索引,而不是 1 索引)。这可以在这里在线找到:

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

这是获得第二行的愚蠢方法,使用islice会更清楚,或者next(f)

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

这里count_letter似乎是int一阵子。可能不是你所期望的。tokenizerstr

    for countletter <= tokenizer:

这也是一个语法错误,所以我认为这不是您正在运行的代码

也许你应该有

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

变成tokenizer一个int

print tokenizer可能会产生误导,因为intstr看起来相同,所以你会看到你期望看到的。print repr(tokenizer)在调试时尝试。

一旦你确定 tokenizer 是一个 int,你就可以改变这一行

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