Skip to main content
 首页 » 编程设计

python之如何按连续性对对象列表进行分组

2025年05月04日16sharpest

给定一个非常大(千兆字节)的任意对象列表(我已经看到一个类似的整数解决方案),我可以通过等价将它轻松分组到子列表中吗?就地或使用原始列表的生成器。

l0 = [A,B, A,B,B, A,B,B,B,B, A, A, A,B] #spaces for clarity 

期望的结果:

[['A', 'B'], ['A', 'B', 'B'], ['A', 'B', 'B', 'B', 'B'], ['A'], ['A'], ['A', 'B']] 

我写了一个这样的循环版本:

#find boundaries 
b0 = [] 
prev = A 
group = A 
for idx, elem in enumerate(l0): 
    if elem == group: 
        b0.append(idx) 
    prev = elem 
b0.append(len(l0)-1) 
 
for idx, b in enumerate(b0): 
    try: 
        c = b0[idx+1] 
    except: 
        break 
    if c == len(l0)-1: 
        l1.append(l0[b:]) 
    else: 
        l1.append(l0[b:c]) 

这可以作为生成器 gen0(l) 来完成吗,它的工作方式如下:

for g in gen(l0): 
    print g 
.... 
['A', 'B'] 
['A', 'B', 'B'] 
['A', 'B', 'B', 'B', 'B'] 
....  

等等?

编辑:使用 python 2.6 或 2.7

编辑:首选解决方案,主要基于已接受的答案:

def gen_group(f, items): 
    out = [items[0]] 
    while items: 
        for elem in items[1:]: 
            if f(elem, out[0]): 
                break 
            else: 
                out.append(elem) 
 
        for _i in out: 
            items.pop(0) 
        yield out 
        if items: 
            out = [items[0]] 
 
g = gen_group(lambda x, y: x == y, l0) 
 
for out in g: 
    print out 

请您参考如下方法:

也许是这样的:

def subListGenerator(f,items): 
    i = 0 
    n = len(items) 
    while i < n: 
        sublist = [items[i]] 
        i += 1 
        while i < n and not f(items[i]): 
            sublist.append(items[i]) 
            i += 1 
        yield sublist 

像这样使用:

>>> items = ['A', 'B', 'A', 'B', 'B', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'B'] 
>>> g = subListGenerator(lambda x: x == 'A',items) 
>>> for x in g: print(x) 
 
['A', 'B'] 
['A', 'B', 'B'] 
['A', 'B', 'B', 'B', 'B'] 
['A'] 
['A'] 
['A', 'B']