对文本中数据的分类问题
非常感谢你在百忙之中抽空为我解答,以下是问题:对文本中的数据冒号后面部分的数据进行分类:
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 先 split(':') 拆分每一行成两部分,然后左侧的作为 dict key 右侧的 split(',') 作为一个列表,成为 dict 的 item
对每一行执行上述操作
从 list 里随机获得四个随机数
import random
a =
b = []
for each in range(4):
num = random.randint(0, len(a)-1)
print("取出 {}".format(a))
b.append(a)
del a
print(b)
循环,检查 四个数是否在下一个 dict key 对应的 dict item,如果在,执行 xxx,不在,执行 yyy 本帖最后由 阿奇_o 于 2021-4-18 23:25 编辑
什么意思?每次抽取出来的4个数对全部数据逐个查找,看是否有完全相同的?
从里面抽取的,又逐个验证?
嗯,先不管题目啥意思,我给出相关代码,你自己琢磨吧,
with open('文本数据检查与分类.txt') as f:
lines = f.readlines()
data = .split(',') for l in lines]
print(data[:3])
from itertools import combinations as cb
# ls = ['02', '06', '07', '24', '28', '29']
# for d in data:
for c in cb(data, 4): #只测试第一行数据
print(c) 阿奇_o 发表于 2021-4-18 23:23
什么意思?每次抽取出来的4个数对全部数据逐个查找,看是否有完全相同的?
从里面抽取的,又逐个验证?
...
谢谢你给出了随机抽取4个数的那部分,我主要不懂后面那部分怎么写。
即随机抽取的这4个数跟所有的数据进行对比,如找到包含有这4个数字的那条数据,就将该条数据输出到文本中,文本的文件名以这4个数字命名。
data = """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"""
from random import sample
text = "A0001:02,06,07,24,28,29"
nums = text.split(":")[-1].split(",")
rand = sorted(sample(nums,4),key = nums.index)
print(rand)
for i in data.split("\n"):
if set(rand).issubset(set(i.split(":")[-1].split(","))):
print(i)
qq1151985918 发表于 2021-4-19 06:13
学习了,一定得要组成集合吗?用list 不行吗? 要是数据有重复得怎么办? 本帖最后由 qq1151985918 于 2021-4-19 09:28 编辑
z5560636 发表于 2021-4-19 08:58
学习了,一定得要组成集合吗?用list 不行吗? 要是数据有重复得怎么办?
这个当然不是,自己写个函数一样可以,只是只有集合才有子集的判断方式issubset 这个方法,
数据重复根据题目来看用集合也是没问题的,因为你即使不用集合归根结底也是同样的判断方式,
或者用 in 或者其他方式,总归跟去重操作无关,
不信你再算一算。
而且这个数据我个人感觉和双色球极为类似(99.99%),可能不存在重复的可能 Daniel_Zhang 发表于 2021-4-18 23:00
先 split(':') 拆分每一行成两部分,然后左侧的作为 dict key 右侧的 split(',') 作为一个列表,成为 dict 的 ...
谢谢回复。可以把检查 四个数是否在下一个 dict key 对应的 dict item,如果在,执行 xxx,不在,执行 yyy
的代码写一下吗? qq1151985918 发表于 2021-4-19 06:13
谢谢你再次回复。可以在代码后面写上注释吗? 阿智兄 发表于 2021-4-19 22:12
谢谢你再次回复。可以在代码后面写上注释吗?
data = """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"""
# 加载 random 中的函数 sample 此函数用于随机选取列表中的 n 个元素
from random import sample
text = "A0001:02,06,07,24,28,29"
# split() 函数用于以分隔符号为规则分割字符串
# 字符串分割后以字符串形式储存于列表
nums = text.split(":")[-1].split(",")
# sample(nums,4) 表示从 nums 中随机选取 4 个不重复元素并返回一个列表
# sorted() 表示对列表进行指定要求的排序,这里用的 key 为按照 nums 顺序排序
# sorted() 有返回值
rand = sorted(sample(nums,4),key = nums.index)
print(rand)
for i in data.split("\n"):
# set() 函数为将列表或者元组等转换为集合,同时会去重,也就是相同元素只会保留一个
# issubset() 函数为判断前者是否为后者子集
# 特别说明下,如果函数名用 is 开头基本上就是判断函数,返回值为 True 或者 False
# subset 的意思为子集,issubset 就是判断是否为子集
# digit 的意思为数字,isdigit 就是判断是否为数字
# space 的意思为空格,isspace 就是判断是否为空格,同样的函数还有很多很多……
if set(rand).issubset(set(i.split(":")[-1].split(","))):
print(i)
qq1151985918 发表于 2021-4-20 10:43
再次谢谢你的帮助。
页:
[1]