Проверка, содержит ли последовательность последовательные идентичные символы

#python #loops #character #sequence

#python #циклы #символ #последовательность

Вопрос:

Для этой функции я пытаюсь вернуть «True», когда последовательность содержит последовательные идентичные символы, и вернуть «False», когда последовательность этого не делает. Например, neighboring_twins(1,2,1,4,1) should return False в то время neighboring_twins(1,2,3,3,5) как should return True потому что есть два одинаковых символа непосредственно рядом друг с другом (два 3-х).

Это код, который у меня есть до сих пор. Я не думаю, что поиск в Python "ii" — это правильный способ сделать это, поскольку я продолжаю получать синтаксические ошибки. Я не был уверен, как я мог бы поручить Python искать последовательные идентичные символы, но предположил, что я должен использовать цикл for .

 def neighboring_twins(xs):

    for i in xs:
        if ii = True
            return True
        elif ii = False
            return False
  

Редактировать: я хотел бы выполнить это без импорта из других модулей и максимально простым способом.

Ответ №1:

pairwise Функция из рецептов itertools вернет список пар последовательных элементов. С этого момента вы просто понимаете список того, что вам нужно:

 from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

def neighboring_twins(xs):
    return any([x for x in pairwise(xs) if x[0]==x[1]])
  

Или напрямую, без копирования pairwise :

 from itertools import tee, izip
def neighboring_twins(xs):
    a, b = tee(xs)
    next(b, None)
    return any([x for x in izip(a, b) if x[0]==x[1]])
  

Редактировать:
Вы могли бы достичь той же функциональности без использования itertools, хотя и с некоторым снижением производительности:

 def neighboring_twins(xs):
    return any([x for x in zip(xs, xs[1::]) if x[0]==x[1]])
  

Комментарии:

1. @famguy74 Этот фрагмент отлично работает на моей машине (Python 2.7.12 на Fedora 24). Какую именно ошибку вы получаете?

2. Я удалил свой первоначальный комментарий, потому что я выяснил проблему, вместо того, чтобы копировать его, я переписал его, и возникли проблемы с интервалом

3. Я получаю сообщение об ошибке «tee», которое не определено, когда я пытаюсь его протестировать.

4. @famguy74 tee и izip должны быть импортированы из itertools. Я отредактировал свой ответ с помощью правильного импорта.

5. Я должен был упомянуть об этом в своем первоначальном вопросе, но я бы хотел выполнить это без импорта из других модулей. Это должно быть выполнимо с циклами, типами данных, списками и функциями. Теперь я пересмотрю исходный вопрос.

Ответ №2:

Вы получаете синтаксические ошибки, потому if ii что запрашиваете интерпретатор Python проверить переменную ii и посмотреть, верно это или нет. Я бы рекомендовал выполнить итерацию по списку и проверить следующий элемент, чтобы увидеть, равен ли он следующему. enumerate() будет полезно для вас.

Я также заметил, что вы используете if ii = True which присваивает значение True для ii вместо проверки, если ii это True. Вы, вероятно, хотите if ii == True . == Проверка на равенство и один знак равенства присваивает значение переменной.