鱼C论坛

 找回密码
 立即注册
查看: 1511|回复: 10

[已解决]对文本中数据的分类问题

[复制链接]
发表于 2021-4-18 22:38:39 | 显示全部楼层 |阅读模式

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

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

x
非常感谢你在百忙之中抽空为我解答,以下是问题:
对文本中的数据冒号后面部分的数据进行分类:
1.从A0001冒号后面的6个数中每次抽取4个(取15次,即C(6,4)),将每次抽取出来的4个数对全部数据逐个查找,看是否有完全相同的,如有则将该行数据写入一个新建的文本中。
2.举例:比如在文本的第一行抽取的是02,06,24,29,在对全部数据逐个查找得到的结果输出到新建文本(新建文件名以抽取的4个数命名02,06,24,29.txt)中如下:
A0001:02,06,07,24,28,29
A0005:01,02,06,11,24,29
A0017:01,02,06,10,24,29

以下是文本的部分数据:
A0001:02,06,07,24,28,29
A0002:02,08,21,24,29,31
A0003:05,07,09,16,18,27
A0004:13,17,19,24,26,30
A0005:01,02,06,11,24,29
A0006:12,14,18,20,26,28
A0007:04,10,12,18,23,25
A0008:02,12,13,14,31,33
A0009:01,05,08,15,16,30
A0010:06,11,21,25,28,31
A0011:08,09,13,27,29,31
A0012:08,10,15,17,22,30
A0013:11,16,23,26,27,33
A0014:05,07,09,16,20,26
A0015:03,05,13,19,20,25
A0016:06,08,14,17,18,30
A0017:01,02,06,10,24,29
A0018:02,21,22,23,27,28
A0019:10,15,17,25,31,32
A0020:04,08,17,24,28,33
A0021:01,03,06,07,09,11
A0022:12,16,17,24,28,29
A0023:02,08,14,23,25,32
A0024:09,15,18,29,32,33
A0025:03,08,09,13,15,18
A0026:06,14,16,26,28,29
A0027:04,15,21,25,29,33
A0028:06,09,12,16,27,31
A0029:03,06,14,18,20,26
A0030:05,10,16,23,27,33
最佳答案
2021-4-20 10:43:17
阿智兄 发表于 2021-4-19 22:12
谢谢你再次回复。可以在代码后面写上注释吗?

  1. data = """A0001:02,06,07,24,28,29
  2. A0002:02,08,21,24,29,31
  3. A0003:05,07,09,16,18,27
  4. A0004:13,17,19,24,26,30
  5. A0005:01,02,06,11,24,29
  6. A0006:12,14,18,20,26,28
  7. A0007:04,10,12,18,23,25
  8. A0008:02,12,13,14,31,33
  9. A0009:01,05,08,15,16,30
  10. A0010:06,11,21,25,28,31
  11. A0011:08,09,13,27,29,31
  12. A0012:08,10,15,17,22,30
  13. A0013:11,16,23,26,27,33
  14. A0014:05,07,09,16,20,26
  15. A0015:03,05,13,19,20,25
  16. A0016:06,08,14,17,18,30
  17. A0017:01,02,06,10,24,29
  18. A0018:02,21,22,23,27,28
  19. A0019:10,15,17,25,31,32
  20. A0020:04,08,17,24,28,33
  21. A0021:01,03,06,07,09,11
  22. A0022:12,16,17,24,28,29
  23. A0023:02,08,14,23,25,32
  24. A0024:09,15,18,29,32,33
  25. A0025:03,08,09,13,15,18
  26. A0026:06,14,16,26,28,29
  27. A0027:04,15,21,25,29,33
  28. A0028:06,09,12,16,27,31
  29. A0029:03,06,14,18,20,26
  30. A0030:05,10,16,23,27,33"""

  31. # 加载 random 中的函数 sample 此函数用于随机选取列表中的 n 个元素
  32. from random import sample

  33. text = "A0001:02,06,07,24,28,29"
  34. # split() 函数用于以分隔符号为规则分割字符串
  35. # 字符串分割后以字符串形式储存于列表
  36. nums = text.split(":")[-1].split(",")
  37. # sample(nums,4) 表示从 nums 中随机选取 4 个不重复元素并返回一个列表
  38. # sorted() 表示对列表进行指定要求的排序,这里用的 key 为按照 nums 顺序排序
  39. # sorted() 有返回值
  40. rand = sorted(sample(nums,4),key = nums.index)
  41. print(rand)

  42. for i in data.split("\n"):
  43.     # set() 函数为将列表或者元组等转换为集合,同时会去重,也就是相同元素只会保留一个
  44.     # issubset() 函数为判断前者是否为后者子集
  45.     # 特别说明下,如果函数名用 is 开头基本上就是判断函数,返回值为 True 或者 False
  46.     # subset 的意思为子集,issubset 就是判断是否为子集
  47.     # digit 的意思为数字,isdigit 就是判断是否为数字
  48.     # space 的意思为空格,isspace 就是判断是否为空格,同样的函数还有很多很多……
  49.    
  50.     if set(rand).issubset(set(i.split(":")[-1].split(","))):
  51.         print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-18 23:00:20 | 显示全部楼层
先 split(':') 拆分每一行成两部分,然后左侧的作为 dict key 右侧的 split(',') 作为一个列表,成为 dict 的 item

对每一行执行上述操作

从 list 里随机获得四个随机数

  1. import random

  2. a = [1, 2, 3, 4, 5, 6]

  3. b = []

  4. for each in range(4):
  5.     num = random.randint(0, len(a)-1)
  6.     print("取出 {}".format(a[num]))
  7.     b.append(a[num])
  8.     del a[num]

  9. print(b)
复制代码


循环,检查 四个数是否在下一个 dict key 对应的 dict item,如果在,执行 xxx,不在,执行 yyy
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 23:23:52 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-18 23:25 编辑

什么意思?每次抽取出来的4个数对全部数据逐个查找,看是否有完全相同的?

从里面抽取的,又逐个验证?

嗯,先不管题目啥意思,我给出相关代码,你自己琢磨吧,
  1. with open('文本数据检查与分类.txt') as f:
  2.     lines = f.readlines()
  3.     data = [l[6:-1].split(',') for l in lines]
  4.     print(data[:3])

  5. from itertools import combinations as cb
  6. # ls = ['02', '06', '07', '24', '28', '29']
  7. # for d in data:   

  8. for c in cb(data[0], 4):    #只测试第一行数据
  9.     print(c)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 01:08:07 | 显示全部楼层
阿奇_o 发表于 2021-4-18 23:23
什么意思?每次抽取出来的4个数对全部数据逐个查找,看是否有完全相同的?

从里面抽取的,又逐个验证?
...

谢谢你给出了随机抽取4个数的那部分,我主要不懂后面那部分怎么写。
即随机抽取的这4个数跟所有的数据进行对比,如找到包含有这4个数字的那条数据,就将该条数据输出到文本中,文本的文件名以这4个数字命名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 06:13:56 | 显示全部楼层
  1. data = """A0001:02,06,07,24,28,29
  2. A0002:02,08,21,24,29,31
  3. A0003:05,07,09,16,18,27
  4. A0004:13,17,19,24,26,30
  5. A0005:01,02,06,11,24,29
  6. A0006:12,14,18,20,26,28
  7. A0007:04,10,12,18,23,25
  8. A0008:02,12,13,14,31,33
  9. A0009:01,05,08,15,16,30
  10. A0010:06,11,21,25,28,31
  11. A0011:08,09,13,27,29,31
  12. A0012:08,10,15,17,22,30
  13. A0013:11,16,23,26,27,33
  14. A0014:05,07,09,16,20,26
  15. A0015:03,05,13,19,20,25
  16. A0016:06,08,14,17,18,30
  17. A0017:01,02,06,10,24,29
  18. A0018:02,21,22,23,27,28
  19. A0019:10,15,17,25,31,32
  20. A0020:04,08,17,24,28,33
  21. A0021:01,03,06,07,09,11
  22. A0022:12,16,17,24,28,29
  23. A0023:02,08,14,23,25,32
  24. A0024:09,15,18,29,32,33
  25. A0025:03,08,09,13,15,18
  26. A0026:06,14,16,26,28,29
  27. A0027:04,15,21,25,29,33
  28. A0028:06,09,12,16,27,31
  29. A0029:03,06,14,18,20,26
  30. A0030:05,10,16,23,27,33"""

  31. from random import sample

  32. text = "A0001:02,06,07,24,28,29"
  33. nums = text.split(":")[-1].split(",")
  34. rand = sorted(sample(nums,4),key = nums.index)
  35. print(rand)

  36. for i in data.split("\n"):
  37.     if set(rand).issubset(set(i.split(":")[-1].split(","))):
  38.         print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 08:58:12 | 显示全部楼层

学习了,一定得要组成集合吗?  用list 不行吗?   要是数据有重复得怎么办?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 09:21:58 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-4-19 09:28 编辑
z5560636 发表于 2021-4-19 08:58
学习了,一定得要组成集合吗?  用list 不行吗?   要是数据有重复得怎么办?


这个当然不是,自己写个函数一样可以,只是只有集合才有子集的判断方式  issubset 这个方法,
数据重复根据题目来看用集合也是没问题的,因为你即使不用集合归根结底也是同样的判断方式,
或者用 in 或者其他方式,总归跟去重操作无关,
不信你再算一算。
而且这个数据我个人感觉和双色球极为类似(99.99%),可能不存在重复的可能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 21:45:21 | 显示全部楼层
Daniel_Zhang 发表于 2021-4-18 23:00
先 split(':') 拆分每一行成两部分,然后左侧的作为 dict key 右侧的 split(',') 作为一个列表,成为 dict 的 ...

谢谢回复。可以把检查 四个数是否在下一个 dict key 对应的 dict item,如果在,执行 xxx,不在,执行 yyy
的代码写一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 22:12:48 | 显示全部楼层

谢谢你再次回复。可以在代码后面写上注释吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-20 10:43:17 | 显示全部楼层    本楼为最佳答案   
阿智兄 发表于 2021-4-19 22:12
谢谢你再次回复。可以在代码后面写上注释吗?

  1. data = """A0001:02,06,07,24,28,29
  2. A0002:02,08,21,24,29,31
  3. A0003:05,07,09,16,18,27
  4. A0004:13,17,19,24,26,30
  5. A0005:01,02,06,11,24,29
  6. A0006:12,14,18,20,26,28
  7. A0007:04,10,12,18,23,25
  8. A0008:02,12,13,14,31,33
  9. A0009:01,05,08,15,16,30
  10. A0010:06,11,21,25,28,31
  11. A0011:08,09,13,27,29,31
  12. A0012:08,10,15,17,22,30
  13. A0013:11,16,23,26,27,33
  14. A0014:05,07,09,16,20,26
  15. A0015:03,05,13,19,20,25
  16. A0016:06,08,14,17,18,30
  17. A0017:01,02,06,10,24,29
  18. A0018:02,21,22,23,27,28
  19. A0019:10,15,17,25,31,32
  20. A0020:04,08,17,24,28,33
  21. A0021:01,03,06,07,09,11
  22. A0022:12,16,17,24,28,29
  23. A0023:02,08,14,23,25,32
  24. A0024:09,15,18,29,32,33
  25. A0025:03,08,09,13,15,18
  26. A0026:06,14,16,26,28,29
  27. A0027:04,15,21,25,29,33
  28. A0028:06,09,12,16,27,31
  29. A0029:03,06,14,18,20,26
  30. A0030:05,10,16,23,27,33"""

  31. # 加载 random 中的函数 sample 此函数用于随机选取列表中的 n 个元素
  32. from random import sample

  33. text = "A0001:02,06,07,24,28,29"
  34. # split() 函数用于以分隔符号为规则分割字符串
  35. # 字符串分割后以字符串形式储存于列表
  36. nums = text.split(":")[-1].split(",")
  37. # sample(nums,4) 表示从 nums 中随机选取 4 个不重复元素并返回一个列表
  38. # sorted() 表示对列表进行指定要求的排序,这里用的 key 为按照 nums 顺序排序
  39. # sorted() 有返回值
  40. rand = sorted(sample(nums,4),key = nums.index)
  41. print(rand)

  42. for i in data.split("\n"):
  43.     # set() 函数为将列表或者元组等转换为集合,同时会去重,也就是相同元素只会保留一个
  44.     # issubset() 函数为判断前者是否为后者子集
  45.     # 特别说明下,如果函数名用 is 开头基本上就是判断函数,返回值为 True 或者 False
  46.     # subset 的意思为子集,issubset 就是判断是否为子集
  47.     # digit 的意思为数字,isdigit 就是判断是否为数字
  48.     # space 的意思为空格,isspace 就是判断是否为空格,同样的函数还有很多很多……
  49.    
  50.     if set(rand).issubset(set(i.split(":")[-1].split(","))):
  51.         print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-20 13:12:27 | 显示全部楼层

再次谢谢你的帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 16:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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