如何在Python中将相似的序列保留顺序分组?

时间:2019-07-07 22:20:36

标签: python list grouping

我想在Python中拆分项目的列表序列,或者如果它们相似则将它们分组。

  

我已经找到了一种解决方案,但是我想知道是否有更好,更有效的方法(总是想了解更多)。

这是主要目标

input = ['a','a', 'i', 'e', 'e', 'e', 'i', 'i', 'a', 'a'] 
desired_ouput = [['a','a'], ['i'], ['e','e', 'e'], ['i', 'i'], ['a', 'a']  

所以基本上我选择按相似的邻居分组。我尝试找到一种方法将它们分开(如果不同),但无法成功解决。

  

我也很想听听揭露问题的好方法

#!/usr/bin/env python3
def group_seq(listA):
    listA = [[n] for n in listA]
    for i,l in enumerate(listA):
        _curr = l
        _prev = None
        _next= None
        if i+1 < len(listA):
            _next = listA[i+1]
        if i > 0:
            _prev = listA[i-1]    
        if _next is not None and _curr[-1] == _next[0]:
            listA[i].extend(_next)
            listA.pop(i+1)
        if _prev is not None and _curr[0] == _prev[0]:
            listA[i].extend(_prev)
            listA.pop(i-1)
    return listA  
listA = ['a','a', 'i', 'e', 'e', 'e', 'i', 'i', 'a', 'a']
output = group_seq(listA)    
print(listA)
['a', 'a', 'i', 'e', 'e', 'e', 'i', 'i', 'a', 'a']
print(output)   
[['a', 'a'], ['i'], ['e', 'e', 'e'], ['i', 'i'], ['a', 'a']]

1 个答案:

答案 0 :(得分:2)

我认为itertool.groupby可能是最好的方法。它足够灵活和高效,几乎无法自己重新实现它:

from itertools import groupby

inp = ['a','a', 'i', 'e', 'e', 'e', 'i', 'i', 'a', 'a'] 

output = [list(g) for k,g in groupby(inp)]
print(output)

打印

[['a', 'a'], ['i'], ['e', 'e', 'e'], ['i', 'i'], ['a', 'a']]

如果您自己实现它,它可能会简单得多。只需跟踪先前的值和您要附加的当前列表即可:

def group_seq(listA):
    prev = None
    cur = None
    ret = []

    for l in listA:
        if l == prev:    # assumes list doesn't contain None
            cur.append(l)
        else:
            cur = [l]
            ret.append(cur)
        prev = l

    return ret