鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-23 16:20:21 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-12-23 16:29 编辑

因为我现在用手机笔记本写的,代码有点长,懒得优化:
  1. data = """location1..100000
  2. location1..100001
  3. location1..100002
  4. location1..100003
  5. location1..100004
  6. location1..100005
  7. location1..100008
  8. location1..100009
  9. location1..100010
  10. location2..100000
  11. location2..100001
  12. location2..100002
  13. location2..100003
  14. location2..100004
  15. location2..100005
  16. location2..100006
  17. location3..100018
  18. location3..100019
  19. location3..100020
  20. location3..100021
  21. location3..100022
  22. location3..100026
  23. location3..100027
  24. location3..100028
  25. location3..100029
  26. location3..100030
  27. location3..100031
  28. location3..100032
  29. location3..100033"""

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

  32. x = arr[0][0]
  33. y = arr[0][1]
  34. res = []
  35. temp = []

  36. for n, each in enumerate(arr):
  37.         a, b = each
  38.         if(a != x or b != y):
  39.                 res.append(temp)
  40.                 temp = [(a, b)]
  41.                 x = a
  42.                 y = b+1
  43.         elif n == len(arr)-1:
  44.                 temp.append((a, b))
  45.                 res.append(temp)
  46.         else:
  47.                 temp.append((a, b))
  48.                 y += 1

  49. del arr

  50. for each in res:
  51.         print(each[0][0], each[0][1], each[-1][1], each[-1][1]-each[0][1]+1)
复制代码
结果:
  1. location1 100000 100005 6
  2. location1 100008 100010 3
  3. location2 100000 100006 7
  4. location3 100018 100022 5
  5. location3 100026 100033 8
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢帮助,祝圣诞快乐~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

圣诞快乐
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

哈哈,只能说我手机不好使啊,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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