【python】合并list中连续的数值,比如: [1,2,3, 7,8,9] 合并成[‘1~3‘, ‘7~9‘]

写在前面

分享一下自己写的代码,比较简单,以后可能会复用,就在这里做个记录❀。

简单说下,这里要实现的是什么,为什么要实现它,怎么实现它?

  1. What:给定一个列表(数值元素),将其相邻的元素以某种形式合并显示(转化为以字符串为元素的列表),例如:

    输入:[1, 2, 5, 6, 7, 8, 10]
    输出:[‘1~2’, ‘5~8’, ‘10’]

    输出格式可自定义,这里就是示例说明如何“合并”。

  2. why:实现这个操作是因为数值的展示问题,当数值列表元素非常多,但你只是想知道这些元素都在什么区间范围,使用上面示例的"合并"方式,看起来可能会更轻松。最终目的,就是简化展示结果。

    请注意,"合并"这些数值是前提知道输入的数据是会有大量相邻的数值,如果输入的数据列表本身就较少连续的,可能就没有必要这么做。

  3. howshow 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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值