【问题标题】:Generalising different for-loop method in Python在 Python 中推广不同的 for 循环方法
【发布时间】:2019-02-07 14:45:20
【问题描述】:

我有以下代码,我试图在其中形成一个数组'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]。

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

【问题讨论】:

  • [[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]] 是 pos_set =2 的正确输出吗?
  • 是的,你没看错。 :)

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


【解决方案1】:

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

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]]

【讨论】:

  • 递归不是我的强项。谢谢哥们! :)
【解决方案2】:

不确定您是如何处理您的问题的,您只是关心构建您的 qpos_set,还是您需要代码方面的帮助来生成符合您目标的实际输出。

这是我编写的代码,它将滚动 n 面骰子(我只是将其设置为 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)

【讨论】:

  • 感谢您的努力,但我只需要泛化函数。虽然,如果您有兴趣,您可以尝试主要问题,即“如果您滚动 n 面骰子并继续这样做,只要您继续滚动更大的值:找到 'winner' 和用于获得它的卷数。对于 n=6,总和为 9,如果 [1, 2, 6] 是卷值,则总和为 3。”
  • @Shubh 绝对是,这里凌晨 4 点刚从酒吧回来哈哈,我明天试试,听起来很有趣
【解决方案3】:

有一个内置的解决方案,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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多