我正在做一个输入一系列数字的程序,并将其中的6个用于制作不同的彩票号码组合。当我创建不同的组合时,我想删除重复项,以便每个组合只打印一次。 这就是我想要发生的事情:
combo_list = [1 2 3 4 5 6 7]
输出应为:
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
我正在使用的代码是:
final = []
for sublist in combo_list:
if sublist not in final:
final.append(sublist)
for item in final:
item = (sorted(item, key=int))
print (' '.join(str(n) for n in item))
但是,当我使用代码时,我得到一个包含许多重复项的输出:
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 6
1 2 3 4 6 7
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 6
1 2 3 5 6 7
1 2 3 4 5 7
1 2 3 5 6 7
1 2 3 4 5 6
1 2 3 4 6 7
1 2 3 4 5 6
1 2 3 5 6 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 4 5 7
1 2 3 5 6 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 3 4 5 6
.
.
.
关于我必须为每个组合更改只打印一次的任何想法?
答案 0 :(得分:5)
import itertools as it
ans = it.combinations([1, 2, 3, 4, 5, 6, 7], 6)
结果应该是:
list(ans)
=> [(1, 2, 3, 4, 5, 6), (1, 2, 3, 4, 5, 7),
(1, 2, 3, 4, 6, 7), (1, 2, 3, 5, 6, 7),
(1, 2, 4, 5, 6, 7), (1, 3, 4, 5, 6, 7),
(2, 3, 4, 5, 6, 7)]
如果您之后需要打印数字,这很容易:
for r in ans:
print ' '.join(str(s) for s in r)
=> 1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
答案 1 :(得分:0)
如果我理解了您的问题,请继续尝试使用combinations模块中的itertools功能。在你的情况下,你会得到:
>>> import itertools
>>> list(itertools.combinations([1,2,3,4,5,6,7],6)
[(1, 2, 3, 4, 5, 6)
(1, 2, 3, 4, 5, 7)
(1, 2, 3, 4, 6, 7)
(1, 2, 3, 5, 6, 7)
(1, 2, 4, 5, 6, 7)
(1, 3, 4, 5, 6, 7)
(2, 3, 4, 5, 6, 7)]
这就是我想你想要的。
请记住combinations
函数的输出是生成器。
答案 2 :(得分:0)
您可以将来源转到itertools.combinations然后:
def lotto(iterable, r):
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
print list(lotto([1, 2, 3, 4, 5, 6, 7], 6))
答案 3 :(得分:0)
基于您希望简单地删除重复项。使用python set
final = []
for sublist in combo_list:
if sublist not in final:
final.append(sublist)
for item in set(tuple(x) for x in final):
item = (sorted(item, key=int))
print (' '.join(str(n) for n in item))
但FWIW - 为什么重新制造轮子使用@ÓscarLópez答案;)
HTH
答案 4 :(得分:0)
comb_list= range(1, 8)
rip_idx = 6
for idx in range(len(comb_list)):
final = comb_list[0:rip_idx -idx ] + comb_list[rip_idx- idx + 1: ]
print final
实现它的简单方法是在没有任何库的情况下解决