2013-02-28 62 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 

所以,想想迭代器和發電機