2013-02-28 5 views
1

Я занимаюсь проблемой python, где я должен различать шаблоны. Например, один шаблон - это то, где я должен считать «оо» окружен несколькими х.Итерация через строку для узоров?

line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx" 

«oo» в окружении x - это только одна из двух других моделей. Я пробовал использовать цикл for, но это неловко не работает. Есть ли способ, которым я могу пройти через строку, чтобы выбрать некоторые шаблоны, чтобы добавить к переменной счетчика? Если я узнаю, как это сделать для этого, я уверен, что смогу найти другие шаблоны для этой практики. :) Спасибо!

и я попытался

for "oo" in line: 
    count += 1 

, но он не работает. Очень плохо с петлями, извините. Ожидаемый выход отсчет для этой модели: 2 O в окружении иксы

+4

Покажите нам, что у вас есть. код, который не работает, ничто не может смутить - скорее это возможность для нас увидеть то, что вы еще не поняли, и помочь вам на самом деле выяснить, что происходит в вашей программе. Кроме того, вы должны указать, каков ожидаемый результат. – mgilson

+0

@mgilson gotcha :) – user2006236

ответ

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». Вещий решение будет:

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

Кажется, я всегда так медленно реагирую на вопросы; но хороший ответ :) – TerryA

+0

@Haidro - Дайте ему время. Вы получите это, и вы начнете отвечать быстрее. Иногда я «обманываю» немного, публикуя минимальный правильный ответ, который я могу, а затем редактирую как сумасшедший в течение следующих 5 минут, чтобы превратить его во что-то полезное ... – mgilson

+0

ХА, спасибо :). Я вижу ваше имя много, и вы очень опытен с python. – TerryA

0

Ваш код должен обеспечить SyntaxError, как вы can't assign to literal. Вы ожидаете пропустить все строки 'oo's в строке, но, увы, это не то, что происходит, или что должно произойти.

Возможно, вы думали о том, что нужно прокрутить строку и посмотреть, сколько там «оо», что невозможно сделать в этом случае.

Существует большая встроенная функция, называемая 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

Три решения, отвечать вашему требованию:

Я попытался с помощью для цикла, но это постыдно не работает.Есть Есть ли способ, которым я могу пройти через строку, чтобы поднять определенные шаблоны до Добавить в переменную 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 

.

Итак, подумайте об итераторах и генераторах

Смежные вопросы