知乎上有人问 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]
如何解决这样的问题呢?
1、首先说明,如果这样的题目都不能写出代码,原因在基本的循环判断没有搞清楚。
2、黄哥在如何训练自己的编程思路 文章所说的,做习题,要像开发项目的流程一样
(需求->需求分析->设计->编码->测试->交付等),
拿到一个习题,还没有进行分析,就匆匆忙忙敲代码,
这个学习方法,是不好的学习方法。
3、如果做这个习题,看黄哥的讲解,先要分析,分析看出是按照相邻元素是不是相同来分组。
设计解决方法,大问题化解为小问题,先化解为找出元素不相同的那个元素的索引,有这个索引后,再进行分组。
4、编码
2019年 3月11 黄哥修改,修改为时间复杂度为O(n)
代码一:
# coding:utf-8
def group_by_element(lst):
'''by 黄哥 基本思路是先取得不同元素起始的索引值,
再按照这个索引值取切片
'''
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):
'''by 黄哥 基本思路是先取得不同元素起始的索引值,
再按照这个索引值,用生成器分组。
'''
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)
思路三:
基本思路用一个二维list [[]], 遍历list,判断前后元素是不是相等,如果相等添加到result[-1],
如果不相等,需要添加一个空[]。
# coding:utf-8
def group_by_element(lst):
'''by 黄哥 基本思路用一个二维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
216小时学会Python
点击黄哥python培训试看视频播放地址