Форум сайта python.su
indiwiduumЕсли тебе нужен прямо .remove() внутри цикла, то for надо заменить на while. Сделать там индекс там и прочее. Тогда оно не будет ничего съедать. Ты просто поленился, сделал такой удобный for, который там всё сам перебирает, а он работает через итератор, который создаёт в фоне. А в итераторе назад ходить нельзя. Если элемент ты взял из итератора, то всё, этот элемент обратно в итератор вернуть нельзя. А в цикле while, где контроль по индексу идёт, можно всё это делать.
Есть какой-то лайфхак это обойти?
Онлайн
import itertools # extreme text = 'aaaabbсaa' print(''.join([''.join([i[0], str(len(list(i[1])))]) for i in itertools.groupby(text)])) # and ultimate print(''.join(map(lambda x: x[0] + str(len(list(x[1]))), itertools.groupby(text))))
Отредактировано AD0DE412 (Дек. 22, 2022 00:01:08)
Офлайн
AD0DE412Есть глобальные функции iter() и next(). Функция iter() создаёт итератор и возвращает его. А функция next() к существующему итератору применяет операцию “взять следующий элемент” и возвращает этот элемент полученный. Когда итератор заканчивается, функция next() порождает исключение StopIteration. Оно внутри итератора возникает, переходит функции next(), а функция next() его уже наружу проводит.
то уж разкажите про протокол next
>>> text = 'abc' >>> >>> text.__iter__ <method-wrapper '__iter__' of str object at 0x7facc4b00ae8> >>> >>> text.__next__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute '__next__' >>> >>> it = iter(text) >>> it <str_iterator object at 0x7facbc979710> >>> >>> it.__iter__ <method-wrapper '__iter__' of str_iterator object at 0x7facbc979710> >>> >>> it.__next__ <method-wrapper '__next__' of str_iterator object at 0x7facbc979710> >>> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> >>> itit = iter(it) >>> itit <str_iterator object at 0x7facbc979710> >>> >>> itit.__iter__ <method-wrapper '__iter__' of str_iterator object at 0x7facbc979710> >>> >>> itit.__next__ <method-wrapper '__next__' of str_iterator object at 0x7facbc979710> >>> >>> next(itit) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
>>> class A: ... def __iter__(self): ... self.n = 0 ... return self ... def __next__(self, default=None): ... if self.n < 3: ... self.n += 1 ... return 'nothing' ... else: ... raise StopIteration ... >>> a = A() >>> a <__main__.A object at 0x7fce57bf9748> >>> >>> it = iter(a) >>> it <__main__.A object at 0x7fce57bf9748> >>> >>> next(it) 'nothing' >>> next(it) 'nothing' >>> next(it) 'nothing' >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 10, in __next__ StopIteration >>> >>> for i in A(): ... print(i) ... nothing nothing nothing >>>
Отредактировано py.user.next (Дек. 22, 2022 11:18:47)
Онлайн
офигенно
Офлайн