복붙노트

[PYTHON] delimiter word에 기반한리스트 분할하기

PYTHON

delimiter word에 기반한리스트 분할하기

다양한 문자열 값을 포함하는 목록이 있습니다. WORD를 볼 때마다 목록을 분할하고 싶습니다. 결과는 정확히 하나의 인스턴스를 포함하는 목록 (원래 목록의 하위 목록이 될 것입니다)입니다. 루프를 사용하여이 작업을 수행 할 수 있지만이를 수행하는 데 좀 더 비범 한 방법이 있습니까?

예 = [ 'A', 'WORD', 'B', 'C', 'WORD', 'D']

결과 = [[ 'A'], [ 'WORD', 'B', 'C'], [ 'WORD', 'D']]

이것은 내가 시도한 것입니다. 그러나 WORD가 있어야 할 다른 목록에 WORD를 넣을 것이므로 실제로 원하는 것을 얻지 못합니다.

def split_excel_cells(delimiter, cell_data):

    result = []

    temp = []

    for cell in cell_data:
        if cell == delimiter:
            temp.append(cell)
            result.append(temp)
            temp = []
        else:
            temp.append(cell)

    return result

해결법

  1. ==============================

    1.발전기를 사용합니다.

    발전기를 사용합니다.

    def group(seq, sep):
        g = []
        for el in seq:
            if el == sep:
                yield g
                g = []
            g.append(el)
        yield g
    
    ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
    result = list(group(ex, 'WORD'))
    print(result)
    

    이 지문

    [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]
    

    이 코드는 반복 가능한 모든 내용을 받아들이고, 반복 가능 (iterable)을 생성합니다 (원하지 않으면 목록에 병합 할 필요가 없습니다).

  2. ==============================

    2.

    import itertools
    
    lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
    w = 'WORD'
    
    spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x]
    

    구분 기호가없는 분할 된 목록이 만들어지며 이는 나에게 더 논리적입니다.

    [['A'], ['B', 'C'], ['D']]
    

    포함 할 구분 기호를 사용하려면이 트릭을 수행해야합니다.

    spl = [[]]
    for x, y in itertools.groupby(lst, lambda z: z == w):
        if x: spl.append([])
        spl[-1].extend(y)
    
  3. ==============================

    3.@ NPE의 해결책은 나에게 매우 파이썬 적으로 보인다. itertools를 사용하는 또 다른 방법은 다음과 같습니다.

    @ NPE의 해결책은 나에게 매우 파이썬 적으로 보인다. itertools를 사용하는 또 다른 방법은 다음과 같습니다.

    from itertools import izip, chain
    example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
    indices = [i for i,x in enumerate(example) if x=="WORD"]
    pairs = izip(chain([0], indices), chain(indices, [None]))
    result = [example[i:j] for i, j in pairs]
    

    이 코드는 주로이 대답을 기반으로합니다.

  4. ==============================

    4.주어진

    주어진

    import more_itertools as mit
    
    
    iterable = ["A", "WORD", "B" , "C" , "WORD" , "D"]
    pred = lambda x: x == "WORD"
    

    암호

    list(mit.split_before(iterable, pred))
    # [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]
    

    more_itertools는> pip install more_itertools를 통해 설치 가능한 타사 라이브러리입니다.

    split_at 및 split_after를 참조하십시오.

  5. from https://stackoverflow.com/questions/15357830/python-splitting-a-list-based-on-a-delimiter-word by cc-by-sa and MIT license