python 如何将列表中相似的多个项目以相同的连续顺序分组

ppcbkaq5  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(89)

我尝试以相同的连续顺序将列表中的类似项目分组,例如:

my_list = ['blue', 'red', 'red', 'blue', 'green', 'red', 'blue', 'green', 'red', 'green', 'blue', 'green', 'blue', red]

字符串
我想要的结果是:

my_list = ['blue', [x2, 'red'], [x2, 'blue', 'green', 'red'], [x2, 'green', 'blue'], red]


我正在尝试将最多3个类似的项目组合在一起-如何执行此操作?
我可以将单个连续项目分组,但不知道如何将多个项目分组。

njthzxwz

njthzxwz1#

你可以迭代地用一个表示重复次数和值的元组来替换重复的项(例如(2, 'blue' , 'green', 'red'))。从模式大小1开始,增加大小,直到找不到更多的重复:

my_list = ['blue', 'red', 'red', 'blue', 'green', 'red', 'blue',
           'green', 'red', 'green', 'blue', 'green', 'blue', 'red']

size = 1
while size*2 <= len(my_list):                # can find repetition
    for start in range(len(my_list)-size):   # starting point
        n = 1
        group = my_list[start:start+size]
        for i in range(start+size,len(my_list),size): 
            if group == my_list[i:i+size]:            # count matches
                n += 1
            else: break
        if n<2 : continue                             # must repeat
        my_list[start:start+n*size] = [(n,*group)]    # replace with tuple
        break                                         # and restart
    else:
        size += 1   # increase size until larger than half
        
print(my_list)         
['blue', (2, 'red'), (2, 'blue', 'green', 'red'), (2, 'green', 'blue'), 'red']

字符串
使用itertools的groupby可以通过直接生成组而不是在for循环中迭代多次来缩短代码(但不一定更清晰):

from itertools import groupby
for size in range(1,len(my_list)//2+1):    
    for start in range(len(my_list)):
        left,end = my_list[:start],start
        for group,(*reps,) in groupby(zip(*[iter(my_list[start:])]*size)):
            left.extend(group if len(reps)<2 else [(len(reps),*group)])
            end += len(reps)*size
        my_list = left+my_list[end:]

相关问题