Python 字符串索引和字符比较
Python string index and character comparing
所以我正在尝试做这样的事情
#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
每当我得到一个字符串恰好以 'b' 结尾,或者倒数第二个是 'b' 后跟 'o' 我得到一个索引超出范围错误。现在在 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 示例那样出现一些破坏它的情况。
Could i iterate through the string itself like so?
for letter in s:
#compare stuff
How would I compare specific indexes in the string using the above method?
在不具体引用索引的情况下进行此类比较的 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
试试这个 - 即转到 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
生成器表达式和求和将是解决它的更好方法:
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
总的来说,这是比较慢的方法;您最好将尽可能多的委托给更高性能的对象方法,例如 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)
returns 下一次出现的 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
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
所以我正在尝试做这样的事情
#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
每当我得到一个字符串恰好以 'b' 结尾,或者倒数第二个是 'b' 后跟 'o' 我得到一个索引超出范围错误。现在在 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 示例那样出现一些破坏它的情况。
Could i iterate through the string itself like so?
for letter in s: #compare stuff
How would I compare specific indexes in the string using the above method?
在不具体引用索引的情况下进行此类比较的 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
试试这个 - 即转到 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
生成器表达式和求和将是解决它的更好方法:
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
总的来说,这是比较慢的方法;您最好将尽可能多的委托给更高性能的对象方法,例如 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)
returns 下一次出现的 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
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