【问题标题】:Splitting a list based on a delimiter word根据分隔符拆分列表
【发布时间】:2013-02-27 18:22:21
【问题描述】:

我有一个包含各种字符串值的列表。每当我看到WORD 时,我都想拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中包含 WORD 的一个实例实现这个?

示例 = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

结果 = [['A'], ['WORD','B','C'],['WORD','D']]

这是我尝试过的,但实际上并没有达到我想要的效果,因为它会将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

【问题讨论】:

    标签: python list split


    【解决方案1】:
    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)
    

    【讨论】:

    • 强烈建议使用这个答案,因为它与内置的itertools 模块非常相似!
    • 不幸的是,如果重复分隔符,第二个版本会给出不正确的结果。
    • AttributeError: 'list' 对象没有属性 'groupby'
    【解决方案2】:

    我会使用生成器:

    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']]
    

    代码接受任何可迭代对象,并生成一个可迭代对象(如果您不想这样做,则必须将其展平为列表)。

    【讨论】:

    • 注意,如果你想从结果中排除分隔符,你可以在group函数的if语句中添加continue语句。
    • 请注意,如果您排除停用词,如果停用词位于输入的末尾,您将生成一个空列表
    【解决方案3】:

    给定

    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_atsplit_after

    【讨论】:

      【解决方案4】:
      • @NPE 的解决方案在我看来非常 Pythonic。这是另一个使用itertools
      • izip 特定于 python 2.7。将 izip 替换为 zip 以在 python 3 中工作
      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]
      

      【讨论】:

      • 谢谢 我也尝试根据索引进行拆分,但不确定如何将它们配对。这是一个非常好的方法。
      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 2019-09-19
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多