如何让这段代码更好用(组合列表)?

时间:2018-06-02 00:52:37

标签: python python-3.x list combinations

import random

def ordenar(inputx):
    inputx = list(inputx)
    inputx = sorted(inputx, key=int)
    return inputx

def get_numbers(totall):
    return random.sample(numeros, totall)

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]

all_jogos = []
maximo_repetido = 9

vezes = 0

while True:
    numbers = get_numbers(15)
    for i in all_jogos:
        total_repetido = len(set(numbers).intersection(i))
        if total_repetido <= maximo_repetido:
            vezes += 1
        else:
            vezes = 0
            break
    if vezes >= len(all_jogos):
        all_jogos.append(numbers)
        print("%s," % ordenar(numbers))

基本上我的目的是生成15个数字的列表,这样它们之间重复的数字不超过9个(变量maximo_repetido),生成尽可能多的列表。与all_jogos中包含的所有列表进行比较,只要条件被接受,它就会随着每个循环而增长。

问题是所有可能的结果都不会发生,因为验证/比较只能在生成15个随机数后完成。

当您要生成数字时,如何进行条件/验证/比较,迫使您仅搜索可能的结果?

1 个答案:

答案 0 :(得分:0)

itertools.combinations(iterable, n)n中的所有iterable - 长度元素组合提供了帮助。这就是你想在这里使用的东西。

import itertools

numbers = range(1, 26)

combos = itertools.combinations(numbers, 15)

combos现在是一个迭代器(不是一个列表,请注意,所以如果你需要多次阅读它,你需要多次阅读它)所有15个长度的组合数字1-25,您可以使用A *或其他一些寻路算法找到最佳解决方案。