Перебор списка. И сравнение его элементов
В общем подскажите как брать три элемента перебирая текстовый файл, чтобы потом проводить проверки с элементов. И пожалуйста что то не в одну строку. Ps"для людей а не для ии"
Ответы (3 шт):
triples
перебирает тройки подряд идущих элементов из последовательности:
def triples(seq):
it = iter(seq)
for a in it: break
for b in it: break
for c in it:
yield a, b, c
a, b = b, c
r = range(10)
for t in triples(r):
print(t)
$ python triples.py (0, 1, 2) (1, 2, 3) (2, 3, 4) (3, 4, 5) (4, 5, 6) (5, 6, 7) (6, 7, 8) (7, 8, 9)
P.S. for a in it: break
хочется заменить на a = next(it)
, но вторая конструкция сломается на пустой последовательности seq
, а первая её правильно обработает. То же самое для следующего for b in it: break
и последовательности из одного элемента.
P.P.S. tuples
позволяет вернуть кортежи любой заданной длины k:
def tuples(seq, k):
it = iter(seq)
ab = tuple(x for _, x in zip(range(k - 1), it))
for c in it:
yield *ab, c
ab = ab[1:] + (c, )
r = range(10)
for t in tuples(r, 4):
print(t)
$ python tuples.py (0, 1, 2, 3) (1, 2, 3, 4) (2, 3, 4, 5) (3, 4, 5, 6) (4, 5, 6, 7) (5, 6, 7, 8) (6, 7, 8, 9)
А вообще тройки перебирать проще всего через zip
списка с самим собой, но со сдвигом:
s = list(range(10))
for x, y, z in zip(s, s[1:], s[2:]):
print(x, y, z)
Решение на итераторах для не только трех элементов. В параметре quantity задается требуемое количество элементов. Вместо data подставьте итератор по файлу.
from collections.abc import Iterable
import itertools
def get_elements(data: Iterable, quantity:int):
iters = (itertools.islice(data, i, None) for i in range(quantity))
yield from zip(*iters)
data=range(5)
print(*get_elements(data, 3))