Существует ли генераторная версия `string.split ()` в Python? - PullRequest
101 голосов
/ 05 октября 2010

string.split() возвращает список экземпляр.Есть ли версия, которая возвращает генератор ?Есть ли какие-то причины против наличия версии генератора?

Ответы [ 14 ]

2 голосов
/ 18 декабря 2017

Я хотел показать, как использовать решение find_iter для возврата генератора для заданных разделителей, а затем использовать попарный рецепт из itertools для построения предыдущей следующей итерации, которая получит фактические слова, как в исходном методе split.


from more_itertools import pairwise
import re

string = "dasdha hasud hasuid hsuia dhsuai dhasiu dhaui d"
delimiter = " "
# split according to the given delimiter including segments beginning at the beginning and ending at the end
for prev, curr in pairwise(re.finditer("^|[{0}]+|$".format(delimiter), string)):
    print(string[prev.end(): curr.start()])

примечание:

  1. Я использую prev & curr вместо prev & next, потому что переопределение next в python - очень плохая идея
  2. Это довольно эффективно
0 голосов
/ 06 февраля 2019

вот простой ответ

def gen_str(some_string, sep):
    j=0
    guard = len(some_string)-1
    for i,s in enumerate(some_string):
        if s == sep:
           yield some_string[j:i]
           j=i+1
        elif i!=guard:
           continue
        else:
           yield some_string[j:]
0 голосов
/ 11 марта 2013
def split_generator(f,s):
    """
    f is a string, s is the substring we split on.
    This produces a generator rather than a possibly
    memory intensive list. 
    """
    i=0
    j=0
    while j<len(f):
        if i>=len(f):
            yield f[j:]
            j=i
        elif f[i] != s:
            i=i+1
        else:
            yield [f[j:i]]
            j=i+1
            i=i+1
0 голосов
/ 26 октября 2011

Мне нужны, по крайней мере, файлы, используемые в качестве генераторов.

Это версия, которую я сделал при подготовке к огромным файлам с пустыми строками, разделенными блоками текста (это нужно будет тщательно протестировать дляугловые шкафы на случай, если вы будете использовать его в производственной системе):

from __future__ import print_function

def isplit(iterable, sep=None):
    r = ''
    for c in iterable:
        r += c
        if sep is None:
            if not c.strip():
                r = r[:-1]
                if r:
                    yield r
                    r = ''                    
        elif r.endswith(sep):
            r=r[:-len(sep)]
            yield r
            r = ''
    if r:
        yield r


def read_blocks(filename):
    """read a file as a sequence of blocks separated by empty line"""
    with open(filename) as ifh:
        for block in isplit(ifh, '\n\n'):
            yield block.splitlines()           

if __name__ == "__main__":
    for lineno, block in enumerate(read_blocks("logfile.txt"), 1):
        print(lineno,':')
        print('\n'.join(block))
        print('-'*40)

    print('Testing skip with None.')
    for word in isplit('\tTony   \t  Jarkko \n  Veijalainen\n'):
        print(word)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...