1

我正在做一个 python 练习题,我必须区分模式。例如,一种模式是我必须计算被几个 x 包围的“oo”。

line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx"

被 x 包围的“oo”只是其他几种模式之一。我尝试使用 for 循环,但令人尴尬的是它不起作用。有没有办法可以通过字符串来获取某些模式以添加到计数变量中?如果我学会了如何做这个,我相信我可以找到这个练习的其他模式。:) 谢谢!

我试过了

for "oo" in line:
    count += 1

但它不起作用。循环真的很糟糕,对不起。预期输出是此模式的计数:2 o's 被 x's 包围

4

4 回答 4

2

首先,你有一个文字 ( "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”。一个pythonic解决方案是:

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

三种解决方案,满足您的需求:

我尝试使用 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()which... 很重要。你如何使用它是:

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 回答