problem-oj4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
给定一个仅包含整数,且按照大小顺序排好序的列表,列表内不存在重复的整数。
实现一个函数,将列表格式化为由`,`(逗号)分隔的字符串;如果相邻的整数(至少3个)是
连续的(值相差1为连续),则将这几个相邻的整数格式化为由`-`(减号)分隔、左右分别为
起始和终止位整数的字符串。

示例:
func([-6,-3,-2,-1,0,1,3,4,5,7,8,9,10,11,14,15,17,18,19,20]) --> '-6,-3-1,3-5,7-11,14,15,17-20'
func([-3,-2,-1,2,10,15,16,18,19,20]) --> '-3--1,2,10,15,16,18-20'

特殊情况示例:
func([]) --> ''
"""

import unittest
from itertools import groupby


def func(lst):
# your code
sum = sub_arr(lst)
return ','.join(sum)


def sub_arr(lst):
fun = lambda x: x[1] - x[0]
sum = []
for k, g in groupby(enumerate(lst), fun):
s = [v for i, v in g]
# print(s)
if len(s) <= 1:
sum.append(str(s[0]))
elif len(s) == 2:
sum.append(str(s[0]))
sum.append(str(s[1]))
else:
target = [str(s[0]), str(s[-1])]
n = '-'.join(target)
sum.append(n)

return sum


class DefaultTestCase(unittest.TestCase):

def test_func(self):
self.assertEqual(func([-6,-3,-2,-1,0,1,3,4,5,7,8,9,10,11,14,15,17,18,19,20]), '-6,-3-1,3-5,7-11,14,15,17-20')
self.assertEqual(func([-3,-2,-1,2,10,15,16,18,19,20]), '-3--1,2,10,15,16,18-20')
self.assertEqual(func([]), '')
self.assertEqual(func([-6,-4,-2,0,2,4,6]), '-6,-4,-2,0,2,4,6')
self.assertEqual(func([-6,-5,-3,-2,0,1,3,4,6]), '-6,-5,-3,-2,0,1,3,4,6')

if __name__ == '__main__':
unittest.main()