在Python中推广不同的for循环方法

时间:2018-09-02 06:32:43

标签: python python-3.x loops for-loop logic

我有以下这段代码,试图在其中形成数组“ opt”。在这里,我采用了三个可能的值'pos_set'= [1、2、3],并且可以类似的方式对此进行扩展。但是,我只想为pos_set的任何可能的整数值提供通用代码。

    opt = []
    if pos_set == 1:
        for j in range(1, n):
            opt.append([j])
    elif pos_set == 2:
        for j in range(1, n):
            for k in range(j+1, n):
                opt.append([j, k])
    elif pos_set == 3:
        for j in range(1, n):
            for k in range(j+1, n):
                for l in range(k+1, n):
                    opt.append([j, k, l])

为了更加清楚起见,我这样做的目的是收集所有的可能性,如果您滚动n边模具,并且只要您滚动更大的值就继续这样做。

例如,如果您滚动序列1-2-6-4,则在这种情况下,较大的数字后面跟随着4。 6,停止滚动。同样,如果您滚动一个序列1-2-6-6,在这种情况下,您会得到一个重复的6,所以您停止了,因为它不大于您之前的滚动。我正在考虑在两个案例中出现较小或相同数字之前的案例,即[1、2、6]。

如果你们能帮助我,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用以下递归函数:

def f(p, n, i=1):
    if p == 0:
        return [[]]
    return [[j, *l] for j in range(i, n) for l in f(p - 1, n, j + 1)]

这样:

print(f(1, 7))
print(f(2, 7))
print(f(3, 7))

输出:

[[1], [2], [3], [4], [5], [6]]
[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6]]
[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]

答案 1 :(得分:1)

不确定您是如何解决问题的,是否只是在考虑构建q pos_set,还是需要代码方面的帮助以产生满足您目标的实际输出。

这是我编写的代码,它将滚动双面骰子(我只是将其设置为100进行演示),但这将继续滚动另一个骰子并附加其值,直到该数字等于或小于该数值,然后再进行前一骰

除非您也需要此部分,否则我将推迟分解代码。让我知道!

import random

die = list(range(1, 100))
temp = [0, 1, 2]
winners = []

while temp[1] > temp[0]:
    temp[0] = random.randint(1, len(die))
    temp[1] = random.randint(1, len(die))
    temp[0] = temp[2]
    if temp[1] > temp[0]:
        winners.append(temp[1])
        temp[2] = temp[1]
    else:
        winners.append(temp[1])
        break

print(winners)

答案 2 :(得分:1)

对此有一个内置的解决方案itertools.combinations:

In [5]: import itertools
In [6]: list(itertools.combinations(range(1,7), 3))
Out[6]:
[(1, 2, 3),
 (1, 2, 4),
 (1, 2, 5),
 (1, 2, 6),
 (1, 3, 4),
 (1, 3, 5),
 (1, 3, 6),
 (1, 4, 5),
 (1, 4, 6),
 (1, 5, 6),
 (2, 3, 4),
 (2, 3, 5),
 (2, 3, 6),
 (2, 4, 5),
 (2, 4, 6),
 (2, 5, 6),
 (3, 4, 5),
 (3, 4, 6),
 (3, 5, 6),
 (4, 5, 6)]