pandas - python列表重复项筛选分组
高洛峰
高洛峰 2017-04-18 09:36:27
[Python讨论组]

有类似列表如下:

list =  ['aaa', 
'aaa', 
'aaa', 
'aaa', 
'ccc', 
'ccc', 
'aaa', 
'aaa', 
'aaa',
'aaa', 
'ccc', 
'ccc', 
'ccc', 
'aaa', 
'aaa', 
'ccc', 
'ccc', 
'ccc', 
'ccc', 
'ccc']

希望能得到如下列表

[
[aaa,aaa,aaa],
[aaa,aaa,aaa,aaa],
[aaa,aaa],
[...],
...
]

试了好久总是不行,太笨吧,求解答。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
迷茫

前几位答主的思路让偶现在提炼出了问题正确的关键词(filter group),也意识到两个库有助于解决这类问题(itertools pandas)
放狗搜,找到的比较不错的答案特地贴在这里,供大家参考。

https://pythonpeixun.github.i...
知乎上有人问,Python中的列表按相同元素分割?
比如列表[0,0,0,1,1,2,3,3,3,2,3,3,0,0]分割成[0,0,0],[1,1],[2],[3,3,3],[2],[3,3],[0,0]

如何解决这样的问题呢?
首先说明,如果这样的题目都不能写出代码,原因在基本的循环判断没有搞清楚。
如果做这个习题,看黄哥的讲解,先要分析,分析看出是按照相邻元素是不是相同来分组。
设计解决方法,大问题化解为小问题,先化解为找出元素不相同的那个元素的索引,有这个索引后,再进行分组。

代码一:

# coding:utf-8


def group_by_element(lst):
    '''基本思路是先取得不同元素起始的索引值,
    再按照这个索引值取切片
    '''
    index = []
    result = []
    for i, _ in enumerate(lst):
        if i < len(lst) - 1 and lst[i + 1] != lst[i]:
            index.append(i + 1)

    result.append(lst[:index[0]])
    for i, item in enumerate(index):
        if i < len(index) - 1:
            result.append(lst[index[i]:index[i + 1]])
    result.append(lst[item:])
    return result

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print group

代码二:

# coding:utf-8


def group_by_element(lst):
    '''基本思路是先取得不同元素起始的索引值,
    再按照这个索引值,用生成器分组。
    '''
    index = []
    for i, _ in enumerate(lst):
        if i < len(lst) - 1 and lst[i + 1] != lst[i]:
            index.append(i + 1)

    def take(lst, n):
        for i in range(n):
            yield next(lst)

    if not hasattr(lst, 'next'):
        lst = iter(lst)

    begin = 0
    for item in index:
        x = list(take(lst, item - begin ))
        begin = item
        yield x

    yield list(lst)

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print list(group)

代码三:

# coding:utf-8


def group_by_element(lst):
    '''基本思路用一个二维list [[]], 遍历list
    判断前后元素是不是相等,如果相等添加到result[-1],如果
    不相等,需要添加一个空[]
    '''
    result = [[]]
    length = len(lst)
    for i in range(length):
        if i < length - 1:
            if lst[i] == lst[i + 1]:
                result[-1].append(lst[i])
            else:
                result[-1].append(lst[i])
                result.append([])

    result[-1].append(lst[i])
    return result

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print group
黄舟

放码:

def modify(lst):
    lst_len = len(lst)
    new_lst = []
    
    def group_lst(lst, i=0):
        if i == lst_len:
            return
        j = i
        _lst = []
        while lst[j] == lst[i]:
            _lst.append(lst[j])
            i += 1
            if i == lst_len: 
                new_lst.append(_lst)
                break
        else:
            new_lst.append(_lst)
        return group_lst(lst, i)
    group_lst(lst)
    return sorted(new_lst)

modify(lst)

结果:

[['aaa', 'aaa'],
 ['aaa', 'aaa', 'aaa', 'aaa'],
 ['aaa', 'aaa', 'aaa', 'aaa'],
 ['ccc', 'ccc'],
 ['ccc', 'ccc', 'ccc'],
 ['ccc', 'ccc', 'ccc', 'ccc', 'ccc']]
阿神

不造轮子了:

from itertools import groupby
from pprint import pprint

pprint([list(v) for _, v in groupby(lst)])

输出:

[['aaa', 'aaa', 'aaa', 'aaa'],
 ['ccc', 'ccc'],
 ['aaa', 'aaa', 'aaa', 'aaa'],
 ['ccc', 'ccc', 'ccc'],
 ['aaa', 'aaa'],
 ['ccc', 'ccc', 'ccc', 'ccc', 'ccc']]
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号