写在前面
分享一下自己写的代码,比较简单,以后可能会复用,就在这里做个记录❀。
简单说下,这里要实现的是什么,为什么要实现它,怎么实现它?
-
What
:给定一个列表(数值元素),将其相邻的元素以某种形式合并显示(转化为以字符串为元素的列表),例如:输入:[1, 2, 5, 6, 7, 8, 10]
输出:[‘1~2’, ‘5~8’, ‘10’]输出格式可自定义,这里就是示例说明如何“合并”。
-
why
:实现这个操作是因为数值的展示问题,当数值列表元素非常多,但你只是想知道这些元素都在什么区间范围,使用上面示例的"合并"方式,看起来可能会更轻松。最终目的,就是简化展示结果。请注意,"合并"这些数值是前提知道输入的数据是会有大量相邻的数值,如果输入的数据列表本身就较少连续的,可能就没有必要这么做。
-
how
:show the CODE. 下面是详细的代码实现,大致说下实现步骤:Step1: 把输入的列表元素,排序并进行分割,
– eg: [1, 2, 5, 6, 7, 8, 10]会分割为[[1, 2], [5, 6, 7, 8], [10]]
Step2: 把Step1分割的列表,子列表的取首尾元素,再用"~"连接。
代码实现
def split_num_l(num_lst):
"""merge successive num, sort lst(ascending or descending): 'as' or 'des'
eg: [1, 3,4,5,6, 9,10] -> [[1], [3, 4, 5, 6], [9, 10]]
"""
num_lst_tmp = [int(n) for n in num_lst]
sort_lst = sorted(num_lst_tmp) # ascending
len_lst = len(sort_lst)
i = 0
split_lst = []
tmp_lst = [sort_lst[i]]
while True:
if i + 1 == len_lst:
break
next_n = sort_lst[i+1]
if sort_lst[i] + 1 == next_n:
tmp_lst.append(next_n)
else:
split_lst.append(tmp_lst)
tmp_lst = [next_n]
i += 1
split_lst.append(tmp_lst)
return split_lst
def mg_str_lst(mylst):
"""[[1], [3, 4, 5, 6], [9, 10]] -> ['1', '3~6', '9~10']
"""
mg_l = []
for num_l in mylst:
if len(num_l) == 1:
mg_l.append(str(num_l[0]))
else:
mg_l.append(str(num_l[0]) + '~' + str(num_l[-1]))
return mg_l
in_lst = [1, 2, 5, 6, 7, 8, 10]
lst_split = split_num_l(in_lst)
lst_mg = mg_str_lst(split_l)
print(lst_mg) # ['1~2', '5~8', '10']
后来又写了一个,把合并的字符展开转换成列表:把区间或逗号分割字符转换为list