Python 如何从长字符串中枚举特定字符,以标识其在字符串中的索引。

Python 如何从长字符串中枚举特定字符,以标识其在字符串中的索引。,python,Python,我写下了下面给出的代码,以枚举字符串的位置及其出现: line = "How to enumerate a particular char from a long string to identify its index in a string." for i, ch in enumerate(line): if ch=='a': v = 0 print v++1,"-->",i+1, 此代码的输出如下所示: 1 --

我写下了下面给出的代码,以枚举字符串的位置及其出现:

line = "How  to enumerate a particular char from a long string to identify its index in a string."


for i, ch in enumerate(line):
        if ch=='a':
            v = 0
            print v++1,"-->",i+1,
此代码的输出如下所示:

1 --> 15 1 --> 19 1 --> 22 1 --> 29 1 --> 34 1 --> 42 1 --> 81
1 --> 15 2 --> 19 3 --> 22 4 --> 29 5 --> 34 6 --> 42 7 --> 81
我应该进行哪些更改,以便获得如下输出:

1 --> 15 1 --> 19 1 --> 22 1 --> 29 1 --> 34 1 --> 42 1 --> 81
1 --> 15 2 --> 19 3 --> 22 4 --> 29 5 --> 34 6 --> 42 7 --> 81
它用字符“a”和它的数字来显示索引值,比如它出现了多少次


谢谢

我想这就是你想要的:

for i, ch in enumerate(line):
        if ch == 'a':
            v += 1
            print("%d --> %d"%(v, i+1))
演示:


每次匹配字符时,您都会增加计数器,这样您就得到了结果

我想这正是你想要的:

line = ("How  to enumerate a particular char from a "
        "long string to identify its index in a string.")

occurrences = 0
for i, ch in enumerate(line, 1):
    if ch=='a':
        occurrences += 1
        print occurrences, "-->", i,
print
输出:

1-->15 2-->19 3-->22 4-->29 5-->34 6-->42 7-->81

请注意,索引是按您所需的方式显示的,但从技术上讲,它不是正确的值,因为Python中的索引是从0开始的,而不是从1开始的。

该条件也可以在一行中完成(它甚至适合80个字符的限制!):

或者也

def frenum(line, N=1):
    for i,ch in enumerate(line,1):
        if ch=='a':
            yield N,i
            N += 1

print ' '.join('%d --> %d' % x for x in frenum(line))
这三个解决方案的执行时间非常相等,我没有成功地用比较代码证明哪一个是最快的:它们的执行时间与检测到的最快的执行时间之间只有1%的差异,不同的执行情况不同

请注意,在其他答案中一个接一个地打印事件的其他解决方案要慢得多,而不是在一次打印中加入它们来打印所有事件:

它们在命令行窗口中的执行速度慢了5.5倍,在空闲窗口中的执行速度慢了20倍。

使用列表理解,可以像下面这样编写。它并没有很好的打印效果,并且使用了零基索引,但它将答案放在一个元组列表中,这可能很有用

line = "How  to enumerate a particular char from a long string to identify its index in a string."

print list(enumerate([x[0] for x in enumerate(line) if x[1]=='a']))
或者,如果您希望打印和索引基于1:

for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']):
    print "%d --> %d" % (y[0]+1,y[1]+1)

Output:

1 --> 15
2 --> 19
3 --> 22
4 --> 29
5 --> 34
6 --> 42
7 --> 81

更多的
++
是无用的,因为这是一个语法错误,而不是一个后增量运算符更准确:)不是在print语句中,您将对它进行增量。但只是在那句话里好吧。。。按照它的使用方式,它绑定为v++(+1)`—只是
v++
不起作用。。。但是是的。。。我只是说,这并不是你已经解决的可变性:)你好。欢迎收看stackoverflow。但是您应该在发布代码之前测试代码。您好,Martineau先生,请注意,创建字符串
'%d-->%d%%(出现次数,i),
并打印它比打印
出现次数
,然后打印
'-->'
然后打印
i
:我比较了这两种方法,第一种方法快3倍。-另请参见我回答中的解决方案,以及我所说的与您的解决方案相比执行时间最快的解决方案。@eyquem:OP的问题不是速度,我也没有声称我的解决方案是实现目标的最快方法。此外,我认为这不重要。这不重要,你是对的。顺便说一下,这就是我们认为Python和C++一样方便的原因,因为很多应用程序获得微秒并不重要,不是吗?但我也认为它不需要太多的努力来增加重大的改进对于第一个论点,我想说,向OP展示比他要求的更多的东西是一种很好的教学实践。否则就不存在XY问题的概念。
line = "How  to enumerate a particular char from a long string to identify its index in a string."

print list(enumerate([x[0] for x in enumerate(line) if x[1]=='a']))
for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']):
    print "%d --> %d" % (y[0]+1,y[1]+1)

Output:

1 --> 15
2 --> 19
3 --> 22
4 --> 29
5 --> 34
6 --> 42
7 --> 81