poppy章鱼 发表于 2021-12-23 15:32:12

python假如第二列数字连续,则输出开始和结束的值

菜鸟求助,生物狗自学python好难。感觉语法和逻辑都还可以,也学习了一段时间了,但是经常卡壳.......

示例数据:
location1..100000
location1..100001
location1..100002
location1..100003
location1..100004
location1..100005
location1..100008
location1..100009
location1..100010
location2..100000
location2..100001
location2..100002
location2..100003
location2..100004
location2..100005
location2..100006
location3..100018
location3..100019
location3..100020
location3..100021
location3..100022
location3..100026
location3..100027
location3..100028
location3..100029
location3..100030
location3..100031
location3..100032
location3..100033


我的数据格式如上所示,数据是按顺序排列的。假如以'..'分割为两列。假如第一列相同,第二列数字是连续(后一行比前一行大1),则输出第一列,加上第二列数字(开始的行数字,结束的行数字),以及对这些连续的行累加。(相当于这样连续的为一个区块,一个区块输出为一行)

比如前6行的第一列相同,第二列都连续,则输出: location1        100000        100005        6
而第七行,虽然第一列相同,但是第二列不符合标准(标准:后一行比前一行大1),所以又算作从新的一个区块,另输出一行。

想要达到的输出结果格式:
location1        100000        100005        6
location1        100008        100010        3
location2        100000        100006        7
location3        100018        100022        5
location3        100026        100033        8

傻眼貓咪 发表于 2021-12-23 16:20:21

本帖最后由 傻眼貓咪 于 2021-12-23 16:29 编辑

因为我现在用手机笔记本写的,代码有点长,懒得优化:data = """location1..100000
location1..100001
location1..100002
location1..100003
location1..100004
location1..100005
location1..100008
location1..100009
location1..100010
location2..100000
location2..100001
location2..100002
location2..100003
location2..100004
location2..100005
location2..100006
location3..100018
location3..100019
location3..100020
location3..100021
location3..100022
location3..100026
location3..100027
location3..100028
location3..100029
location3..100030
location3..100031
location3..100032
location3..100033"""

arr = [(list(item.split("..")), int(list(item.split("..")))) for item in data.split("\n")]
sorted(arr, key = lambda x: x)

x = arr
y = arr
res = []
temp = []

for n, each in enumerate(arr):
        a, b = each
        if(a != x or b != y):
                res.append(temp)
                temp = [(a, b)]
                x = a
                y = b+1
        elif n == len(arr)-1:
                temp.append((a, b))
                res.append(temp)
        else:
                temp.append((a, b))
                y += 1

del arr

for each in res:
        print(each, each, each[-1], each[-1]-each+1)结果:location1 100000 100005 6
location1 100008 100010 3
location2 100000 100006 7
location3 100018 100022 5
location3 100026 100033 8

poppy章鱼 发表于 2021-12-23 17:17:54

傻眼貓咪 发表于 2021-12-23 16:20
因为我现在用手机笔记本写的,代码有点长,懒得优化:结果:

感谢帮助,祝圣诞快乐~

傻眼貓咪 发表于 2021-12-23 17:21:45

poppy章鱼 发表于 2021-12-23 17:17
感谢帮助,祝圣诞快乐~

圣诞快乐{:10_327:}{:10_298:}

阿奇_o 发表于 2021-12-23 18:41:37

傻眼貓咪 发表于 2021-12-23 16:20
因为我现在用手机笔记本写的,代码有点长,懒得优化:结果:

厉害,手机笔记本上就搞定了。。
不过,排序应该用就地排序吧,因为你后面用的是arr,而sorted()不是就地排序,
故arr并没有进行排序。这个结果正确,是因为刚好原来就是排好序的。

其次,你这个几个判断逻辑,让我琢磨了一个多小时才理解,佩服你,逻辑方面看来我比较缺乏训练 {:10_266:}
而我一开始用的是Pandas或SQL来解决,理解上稍微直观些,但需要熟悉pandas或SQL。。

傻眼貓咪 发表于 2021-12-23 19:20:49

阿奇_o 发表于 2021-12-23 18:41
厉害,手机笔记本上就搞定了。。
不过,排序应该用就地排序吧,因为你后面用的是arr,而sorted()不是就 ...

哈哈,只能说我手机不好使啊,{:10_266:}
页: [1]
查看完整版本: python假如第二列数字连续,则输出开始和结束的值