2017-10-08 1 views
1

내가 목록을 가지고 분리 문자 conditionaly 주신 의해 부분으로 목록을 분할하고 나는 다음과 같은 차이점이 문자열에 대한 str.split() 작품처럼 moslty 부분으로 분할 할 :파이썬 방법은

구분 기호는 술어에 의해 주어진다
    1. . 목록의 요소에 대해 술어가 True이면이 요소는 delimeter로 간주됩니다.
    2. 결과 목록에 delimeter를 유지하고 싶습니다. 예를 들어

    :

    def split_by_predicate(it, predicate): 
        lst = [] 
        cur = [] 
        for element in it: 
         if predicate(element): 
          lst.append(cur) 
          cur = [] 
         cur.append(element) 
        lst.append(cur) 
        return lst 
    

    하지만 파이썬은 우아하고하지 못 했습 :

    split_by_predicate([0, "One", 1, 2, 3, 
            "Two", 4, 5, 6, 7, "Three", "Four"], 
            predicate=lambda x: isinstance(x, str)) 
    

    나는 다음과 같은 코드를 작성할 수 있습니다 나에게

    [[0], ["One", 1, 2, 3], ["Two", 4, 5, 6, 7], ["Three"], ["Four"]] 
    

    를 제공해야합니다. 비슷한 접근법이 here (발전기 사용)입니다.

    this one과 같은 itertools 기반 솔루션을 알아 내려고했으나 필자의 예제처럼 delimeter가 반복 될 경우 제대로 작동하지 않습니다.

    현재 코드보다 더 기능적인 스타일로 구현하는 방법이 있습니까?

  • 답변

    5

    이 당신의 기능을 단순화 할 수 있습니다 :

    def split_by_predicate(it, predicate): 
        lst = [[]] 
        for element in it: 
         if predicate(element): 
          lst.append([]) 
         lst[-1].append(element) 
        return lst 
    

    또는이 (skiped로를 첫 번째 반복 빈 목록 추가) :

    def split_by_predicate(it, predicate): 
        lst = [[]] 
        for i, element in enumerate(it): 
         if predicate(element) and i: 
          lst.append([]) 
         lst[-1].append(element) 
        return lst 
    
    +0

    'it'이 첫 번째 요소로'str'을 구성하면'[]'가 비어 있습니다. – mshsayem

    +1

    @mshsayem' ', one, 1,2,3'.split (', ')'- 첫 번째 요소에 빈 문자열을줍니다. 나는 이것이 문제라고 생각하지 않는다. –

    1

    무엇 이것에 대해 :

    def split_by_predicate(it, predicate): 
        o = [] 
        for i in it: 
        if predicate(i) or len(o) == 0: 
         o += [[i]] 
        else: 
         o[-1] += [i] 
        return o 
    

    출력 :

    >>> split_by_predicate([0, 'One', 1, 2, 3, 'Two', 4, 5, 6, 7, 'Three', 'Four'], lambda x: isinstance(x,str)) 
    [[0], ['One', 1, 2, 3], ['Two', 4, 5, 6, 7], ['Three'], ['Four']]