Python字符串索引和字符比较

时间:2015-01-19 22:56:15

标签: python string search slice

所以我试图做这样的事情

#include <stdio.h>

int main(void)
{
    char string[] = "bobgetbob";
    int i = 0, count = 0;
    for(i; i < 10; ++i)
    {
            if(string[i] == 'b' && string[i+1] == 'o' && string[i+2] == 'b')
                    count++;
    }
    printf("Number of 'bobs' is: %d\n",count);

}

但是在python术语中这样工作

count = 0
s = "bobgetbob"
for i in range(0,len(s)):
    if s[i] == 'b' and s[i+1] == 'o' and s[i+2] == 'b':
        count += 1
print "Number of 'bobs' is: %d" % count

任何时候我得到一个字符串,恰好以&#39; b&#39;或倒数第二个是&#39; b&#39;然后是&#39; o&#39;我得到索引超出范围错误。现在在c中这不是一个问题,因为它仍将执行与垃圾值的比较我假设哪个与c一起工作。

如何在不超出范围的情况下在python中执行此操作?

我可以像这样迭代字符串本身吗?

for letter in s:
    #compare stuff

如何使用上述方法比较字符串中的特定索引?如果我尝试使用

letter == 'b' and letter + 1 == 'o'

这是python中的无效语法,我的问题是我在思考c而我并不完全确定正确的语法来解决这种情况。 我知道像这样的字符串切片

for i in range(0,len(s)):
    if s[i:i+3] == "bob":
        count += 1

这解决了这个具体问题,但是,我觉得使用特定的索引位置来比较字符是一个非常强大的工具。我无法弄清楚如何在python中正确地执行此操作,而不会像上面的第一个python示例那样打破它。

5 个答案:

答案 0 :(得分:1)

  

我可以像这样迭代字符串本身吗?

for letter in s:
#compare stuff 
     

如何使用上述方法比较字符串中的特定索引?

进行这种比较的pythonic方法没有特别指代索引:

for curr, nextt, nexttt in zip(s, s[1:], s[2:]):
    if curr == 'b' and nextt == 'o' and nexttt == 'b':
         count += 1

这可以避免索引错误。您还可以使用理解,这样就无需初始化和更新count变量。此行将与您的C代码相同:

>>> sum(1 for curr, nextt, nexttt in zip(s, s[1:], s[2:])
          if curr == 'b' and nextt == 'o' and nexttt == 'b')
2

工作原理: 这是列表之间拉链的结果:

>>> s
'bobgetbob'
>>> s[1:]
'obgetbob'
>>> s[2:]
'bgetbob'

>>> zip(s, s[1:], s[2:])
[('b', 'o', 'b'),
 ('o', 'b', 'g'),
 ('b', 'g', 'e'),
 ('g', 'e', 't'),
 ('e', 't', 'b'),
 ('t', 'b', 'o'),
 ('b', 'o', 'b')]

在循环中,您迭代列表,将每个元组解压缩为三个变量。

最后,如果您真的需要索引,可以使用enumerate

>>> for i, c in enumerate(s):
        print i, c   
0 b
1 o
2 b
3 g
4 e
5 t
6 b
7 o
8 b

答案 1 :(得分:1)

试试这个 - 即转到len(s)-2,因为在那之后你将不会得到一个bob

count = 0
s = "bobgetbob"
for i in range(len(s) - 2):
    if s[i] == 'b' and s[i + 1] == 'o' and s[i + 2] == 'b':
        count += 1
print "Number of 'bobs' is: %d" % count

答案 2 :(得分:1)

生成器表达式和求和将是解决它的更好方法:

print("number of bobs {}".format(sum(s[i:i+3] == "bob" for i in xrange(len(s)) )))

您也可以使用索引作弊,s[i+2:i+3]不会抛出indexError:

count = 0
s = "bobgetbob"
for i in range(0,len(s)):
    print(s[i+1:i+1])
    if s[i] == 'b' and s[i+1:i+2] == 'o' and s[i+2:i+3] == 'b':
        count += 1
print "Number of 'bobs' is: %d" % count
Number of 'bobs' is: 2

答案 3 :(得分:1)

一般来说,这是缓慢的做法;你最好尽可能地委托更高性能的对象方法,如str.find

def how_many(needle, haystack):
    """
    Given
        needle:   str to search for
        haystack: str to search in

    Return the number of (possibly overlapping)
      occurrences of needle which appear in haystack

    ex,  how_many("bb", "bbbbb")  => 4
    """
    count = 0
    i = 0      # starting search index
    while True:
        ni = haystack.find(needle, i)
        if ni != -1:
            count += 1
            i = ni + 1
        else:
            return count

how_many("bob", "bobgetbob")    # => 2

haystack.find(needle, i)会在索引needle之后或之后返回下次出现的i的起始索引,如果没有此类匹配则返回-1

所以

"bobgetbob".find("bob", 0)    # returns 0    => found 1
"bobgetbob".find("bob", 1)    # returns 6    => found 1
"bobgetbob".find("bob", 7)    # returns -1   => no more

答案 4 :(得分:0)

count = 0
for i in range(0,len(s)-2):
    if s[i] == 'b' and s[i+1] == 'o' and s[i+2] == 'b':
        count += 1
print "Number of 'bobs' is: %d" % count