1

パターンを区別する必要があるPythonの練習問題をやっています。たとえば、1 つのパターンは、複数の x で囲まれた「oo」を数えなければならない場合です。

line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx"

x で囲まれた「oo」は、他のいくつかのパターンの 1 つにすぎません。for ループを使用してみましたが、恥ずかしいことに機能しません。カウント変数に追加する特定のパターンを文字列から取得する方法はありますか? この方法を学べば、この練習の他のパタ​​ーンを見つけることができると確信しています。:) ありがとう!

そして私は試しました

for "oo" in line:
    count += 1

しかし、うまくいきません。ループで本当に悪いです、ごめんなさい。予想される出力は、このパターンのカウントです: x で囲まれた 2 つの o

4

4 に答える 4

2

"oo"まず、ループが機能するために変数が必要なリテラル ( ) があります。

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

ループでこのようなことを行うには、文字列の一部を検査し、特定の部分文字列と一致するかどうかを確認して、おそらくindexsをループする必要があります。

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

このようにすることは、間違いなく「pythonic」ではないことに注意してください。Pythonic ソリューションは次のようになります。

line.count('xoox')  #  Batteries included :-)
于 2013-02-28T05:51:13.303 に答える
0

お客様の要求に応える 3 つのソリューション:

for ループを使用してみましたが、恥ずかしいことに機能しません。カウント変数に追加する特定のパターンを文字列から取得する方法はありますか? この方法を学べば、この練習の他のパタ​​ーンを見つけることができると確信しています。

.

ソリューション 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

.

だから、イテレータとジェネレータに考えてください

于 2013-03-01T02:00:36.893 に答える
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
于 2013-02-28T05:52:03.567 に答える
0

あなたに答えを与えるだけでなく、split関数があなたに役立つかもしれません.... http://docs.python.org/2/howto/regex.html#splitting-strings

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

そのコードが返す['xxxx', 'xxxx', 'oxxxx']

それが役立つことを願っています。つまり、'x' で終わる連続した文字列があり、もう一方が 'x' で始まる場合、カウントするオカレンスがあります。

于 2013-02-28T05:52:57.843 に答える