Python 如何在一行中逐字符处理

Python 如何在一行中逐字符处理,python,string,count,Python,String,Count,我有一个在第2行有序列的文件和一个名为tokenizer的变量,它给了我一个旧的位置值。我正在努力寻找新的职位。。例如,这一行的标记器给我位置12,它是E,只计算字母直到12。所以我需要通过计算破折号来确定新的位置 ---------------LL--NE--HVKTHTEEK--PF-ICTVCR-KS---------- 这就是我到目前为止所做的,它仍然不起作用 with open(filename) as f: countletter = 0 countdash = 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
打开(文件名)为f的
:
countletter=0
countdash=0
对于第行,itertools.izip_中的第2行最长(f,f,fillvalue=“”):
标记器=line.split()[4]
打印标记器
对于i,枚举中的字符(第2行):

对于countletter第一个答案,由Chad D编辑为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]
我的原文是这样的,我感兴趣的位置是12,即“E”

实际上,它是K,假设您使用的是零索引字符串。Python使用零索引,所以除非您跳转到1索引(而您不是),否则它将为您提供K。如果您遇到问题,请尝试解决这个问题

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


这是一种获取第二行的愚蠢方式,使用islice或
next(f)

这里的
count\u letter
似乎是一个
int
,而
tokenizer
是一个
str
。可能不是你所期望的

    for countletter <= tokenizer:
tokenizer
转换为
int

print-tokenizer
可能会产生误导,因为
int
str
看起来是一样的,所以您可以看到您期望看到的内容。调试时,请尝试打印repr(标记器)

确保标记器为int后,可以更改此行

    for i,character in enumerate(line2[:tokenizer]):

什么是countletter的
,为什么不能只遍历字符串<代码>对于第2行中的c,缩进是错误的。但对于伯爵的信,我想我只是没听懂。哪个部分不起作用?@Wug我的原文是这样的,我感兴趣的职位是12个,即“E”LLNEHVKTHTEEKPFICTVCRKS。但是由于有额外的破折号有一些改变,我必须考虑那些破折号并想出新的位置。因此,我必须按顺序计算原始E之前的破折号,并将计数添加到12以获得最终结果。请告诉我代码背后的想法。它可以工作,但我从重新调整新索引一直到返回1/0,而不是对我们找到的字母进行计数,然后向上计数,直到计数与我们要查找的数字匹配为止。我们要查找的数字倒计时,直到它达到零,在这一点上,我们找到了正确的字母数。newindex变量跟踪我们找到的字符总数(包括破折号)。我在您的代码中发现了一个bug。。例如,给定与上述相同的序列(字符串),如果旧索引=4、15(或在此序列中有破折号的任何旧索引),程序将运行直到看到新的字母。。因此,新索引的计数是一点点,它生成一个索引为零的答案,并期望一个索引为零的输入。i、 e.字符串中的第一个字符是'zeroth'字符,第二个是'oneth'字符,等等。对于itertools.izip_longest(f,f,fillvalue='')中的第2行,您会对>>做什么不同的处理advices@ChadD,
line=next(f);line2=next(f)
两行以上此函数使用OP提供的输入0、2、4、13、15和21字符串返回短划线字符的索引。使用
打印(字符串[获取新索引(字符串,字符索引)])
进行验证。此外,您不应使用字符串作为变量名,因为它是内置模块的名称。此外,如果您请求以字母开头的字符串中的第0项,此函数将失败。所有优点,Wug,谢谢。Chad编辑了我对return i+1的回复,而不是return i,但即便如此,我的答案还是在应该提供的字符之前提供了字符。将字符初始化为-1解决了这个问题。
for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
    for countletter <= tokenizer:
tokenizer = int(line.split()[4]) 
    for i,character in enumerate(line2[:tokenizer]):