|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 vpo1 于 2016-5-16 16:11 编辑
- def creat_all(n, r):
- # combinations('ABCD', 2) --> AB AC AD BC BD CD
- # combinations(range(4), 3) --> 012 013 023 123
- n_list =[]
- for i in range(1,n+1):
- n_list.append(i)
- pool = tuple(n_list)#到这里都是懂的,是创建了一个1—n的元组
- #print(pool)
- file_name = open("全组合.csv",'w',newline='')
- wr = csv.writer(file_name)#打开文件,准备写入,这里newline=‘’很关键,会阻止写入时创建空行
- if r > n:
- return#如果r大于n,显然错误
- indices = list(range(r))#生成一个列表,即0—r-1的列表,从这里开始看不懂了。。。。。
- wr.writerow(list(pool[i] for i in indices))#写入的第一个组合,最小的组合
- #
- #print(indices)
- while True:
- for i in reversed(range(r)):#返回序列range(r)的反向访问的迭代子。
- if indices[i] != i + n - r:#这里就看不懂了,为什么呢
- break
- else:#这里更奇怪了,这个else对应上面的if吗?好像是不对应的,那么单独的esle。。。。。。。
- return
- indices[i] += 1#为什么要+1
- for j in range(i+1, r):
- indices[j] = indices[j-1] + 1#还是没搞懂
- wr.writerow(list(pool[i] for i in indices))
- #求注释
-
- file_name.close()
复制代码
这个是我写来用于生成n选r组合的一个函数,用于双色球模拟的。在其中走了很多弯路,因为生成一注随机数很简单,全部列举可能组合就比较麻烦了。其中combinations,是一个生成组合的直接可用的方法,需要from itertools import combinations 。但是combintions生成如此大的数据,会给内存带来溢出。所以就弄成了,生成后写入文件的方式,这段代码的核心部分(生成组合)是复制的,自己摸索着可用了,但是完全不理解其中的写法。求高手注释指点。多谢!多谢!
顺便说一句,根据这个函数,生成的33选6的双色球组合,共有1107568种。如果再考虑到蓝球1—16,那就是17721088种
本帖最后由 老忘 于 2016-5-13 15:09 编辑
- ......
- while True:
- for i in reversed(range(r)):
- if indices[i] != i + n - r:
- break
- else:#这里的else不是对应上一个if,而是对应上一个for循环,就是说如果上一个for循环没有走到break,那么就执行这一条语句。
- return
- indices[i] += 1
- for j in range(i+1, r):
- indices[j] = indices[j-1] + 1
- wr.writerow(list(pool[i] for i in indices))
- ......
复制代码
我正好学到小甲鱼的《034丰富的else语句及简洁的with语句》这一课,有提到else的用法,楼主可以看一下。
楼主是否是想告诉我们,彩票中奖机率太小,还是老老实实学好python比较好
|
|