2013-02-28 79 views
1

我正在做一个python练习题,我必须区分模式。例如,一种模式是我必须计算由几个x包围的“oo”。通过字符串迭代模式?

line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx" 

被x包围的“oo”只是其中一个其他图案。我尝试使用for循环,但它令人尴尬无法正常工作。有没有办法通过一个字符串来获取某些模式以添加到count变量中?如果我学会了如何去做这件事,我肯定我可以找到这种做法的其他模式。 :) 谢谢!

,我试图

for "oo" in line: 
    count += 1 

,但它不工作。真的很糟糕,对不起。 预期的输出是这个模式的计:2 O的用x的

+4

让我们看看你到目前为止。不起作用的代码毫无尴尬 - 相反,它是我们看到你不明白的东西的机会,并帮助你真正弄清楚你的程序正在发生什么。另外,你应该提到预期的输出是什么。 – mgilson 2013-02-28 05:33:04

+0

@mgilson gotcha :) – user2006236 2013-02-28 05:45:30

回答

1

首先包围,你有一个文本("oo"),您需要一个变量,以便你的循环工作:

for "oo" in line: 
# ^literal not allowed here 

在为了做这样的事情有一个循环,你可能要循环的指数,检查字符串的一部分,看它是否一个特定子匹配:

count = 0 
for i in range(len(line)): 
    if line[i:i+4] == 'xoox': 
     count += 1 

请注意,这样做绝对不是“pythonic”。一个Python的解决办法是:

line.count('xoox') # Batteries included :-) 
+0

回答问题时,我似乎总是这么慢;但不错的答案:) – TerryA 2013-02-28 05:53:04

+0

@Haidro - 给它时间。你会得到它的窍门,你会开始更快地回答。有时候,我会通过发布最少的正确答案来“欺骗”一下,然后在接下来的5分钟内疯狂地进行编辑,将它变成一些有用的东西...... – mgilson 2013-02-28 05:56:41

+0

哈,谢谢:)。我看到你的名字很多,你对python非常有经验 – TerryA 2013-02-28 05:58:05

0

您的代码应提供SyntaxError,你can't assign to literal。您期望循环遍历字符串中的所有'oo's,但可惜这不是发生了什么,或者会发生什么。

你可能想到的是循环查看字符串,看看有多少'oo存在,在这种情况下无法完成。

有一个伟大的内置功能,称为count() ......这些数字。你如何使用它是:

yourstring.count(str) # str here is what you want to count, 
         # yourstring is where you are counting 

它返回一个整数,所以这是你想要的代码:

>>> line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx" 
>>> line.count('oo') 
3 
0

不只是平了给你的答案split功能可能是有用的你.... http://docs.python.org/2/howto/regex.html#splitting-strings

test = "xxxxooxxxxoooxxxx" 
test.split("oo") 

该代码返回['xxxx', 'xxxx', 'oxxxx']

希望有所帮助。换句话说,如果你有连续的字符串以'x'结尾,而另一个字符串以'x'开头,那么你有一个计数的事件。

0

三种解决方案,来回答你的需求:

我试图用一个for循环,但它令人尴尬的不工作。 有没有办法通过一个字符串来挑选某些模式来 添加到count变量中?如果我学会了如何做到这一点,我是 确定我可以找到这种做法的其他模式。

溶液1

line = "Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox" 
print line,'\n' 

def explore(X): 
    it = iter(X) 
    prec = it.next() 
    print 'prec ch1 next next' 
    for ch in it: 
     print ' %r %r' % (prec,ch), 
     if (prec,ch)==('x','o'): 
      prec = it.next() 
      print ' %r' % prec, 
      if prec=='o': 
       prec = it.next() 
       if prec =='x': 
        print ' %r OK !!' % prec 
        yield 1 
       else: 
        print ' %r not good' % prec 
      else: 
       print ' stop' 
     else: 
      print 
      prec = ch 
print sum(explore(line)) 

结果

Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox 

prec ch1 next next 
'B' 'x' 
'x' 'o' 'o' 'x' OK !! 
'x' 'x' 
'x' 'x' 
'x' ' ' 
' ' 'x' 
'x' 'o' 'o' 'x' OK !! 
'x' ' ' 
' ' ' ' 
' ' 'x' 
'x' 'x' 
'x' 'o' 'x' stop 
'x' 'o' 'x' stop 
'x' 'x' 
'x' 'x' 
'x' 'o' 'x' stop 
'x' 'o' 'x' stop 
'x' 'x' 
'x' 'x' 
'x' 'o' 'x' stop 
'x' '#' 
'#' 'x' 
'x' 'o' 'o' 'o' not good 
'o' 'x' 
'x' 'x' 
'x' 'o' 'o' 'x' OK !! 
3 

溶液2

line = "Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox" 
print line,'\n' 

def expl(X): 
    it4 = iter(X) 
    it4.next();it4.next();it4.next() 
    it3 = iter(X) 
    it3.next();it3.next() 
    it2 = iter(X) 
    it2.next() 
    it1 = iter(X) 
    for a in it4: 
     if (it1.next(),it2.next(),it3.next(),a)==('x','o','o','x'): 
      yield 1 

print sum(expl(line)) 

结果

Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox 

3 

溶液3

line = "Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox" 
print line,'\n' 

import re 
reg = re.compile('(?<=x)oox') 
print len(reg.findall(line)) 

结果

Bxooxxx xoox xxoxoxxxoxoxxxox#xoooxxoox 

3 

所以,想想迭代器和发电机