#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
. ==
Проверка на равенство и один знак равенства присваивает значение переменной.