鱼C论坛

 找回密码
 立即注册
查看: 1036|回复: 5

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

[复制链接]
发表于 2021-12-23 15:32:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
菜鸟求助,生物狗自学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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-23 16:20:21 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 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(".."))[0], int(list(item.split(".."))[1])) for item in data.split("\n")]
sorted(arr, key = lambda x: x[1])

x = arr[0][0]
y = arr[0][1]
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[0][0], each[0][1], each[-1][1], each[-1][1]-each[0][1]+1)
结果:
location1 100000 100005 6
location1 100008 100010 3
location2 100000 100006 7
location3 100018 100022 5
location3 100026 100033 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 17:17:54 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 16:20
因为我现在用手机笔记本写的,代码有点长,懒得优化:结果:

感谢帮助,祝圣诞快乐~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 17:21:45 | 显示全部楼层
poppy章鱼 发表于 2021-12-23 17:17
感谢帮助,祝圣诞快乐~

圣诞快乐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 18:41:37 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 16:20
因为我现在用手机笔记本写的,代码有点长,懒得优化:结果:

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

其次,你这个几个判断逻辑,让我琢磨了一个多小时才理解,佩服你,逻辑方面看来我比较缺乏训练
而我一开始用的是Pandas或SQL来解决,理解上稍微直观些,但需要熟悉pandas或SQL。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈,只能说我手机不好使啊,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表