获取python中置换的总数

2024-04-16 21:47:38 发布

您现在位置:Python中文网/ 问答频道 /正文

但如果在某个条件下,我写了一个函数,但在某个条件下,它大部分是失败的。在

这是我的代码:

def solve_current_level(self):
    self.remaining_possibilities = list(self.remaining_possibilities)
    if len(self.remaining_possibilities) > 10 ** 6:
        #self.reduce_weapon_options()
        pass

    guess = list(random.choice(self.remaining_possibilities))
    response = self.client.solve_level(self.current_level.levelNum, guess)

    if 'roundsLeft' in response:
        self.reset_remaining_possibilities()
        return None
    elif 'response' not in response:
        return response

    self.remaining_possibilities=[possibility for possibility in self.remaining_possibilities if game.Game_evaluate(guess, list(possibility)) == response['response']]
    return None

现在问题发生在生成非常大的排列,然后转换成一个列表来检查长度是否超过10**6,然后做其他事情并返回。这是我目前的解决方案,但问题是当它变得非常庞大的脚本被杀死。我从ruby中转换了这段代码,在ruby中,不需要转换成list就可以得到枚举器的大小,而这个问题在那里从来没有发生过。在

下面是用ruby编写的代码:

^{pr2}$

现在你可以看到,在ruby代码中,置换的长度是在它被转换成数组/散列来继续处理之前计算的,如果这个数字大于10**6,那么它会调用另一个方法“reduce_wear_options”。在python中,如果不先转换成list,就无法得到generator的长度,我需要它以这种方式工作,因为此时当我获得更大范围的大尺寸时,它会卡住并被我的服务器杀死。我不能扩展ram,因为我需要像ruby那样使用更少的ram,我绝对想避免

self.remaining_possibilities = list(self.remaining_possibilities)

在python中,if条件被传递/失败之前。在

注:我正在使用itertools.排列计算后来保存在“中的排列”自我保留的可能性““

以下是python和ruby中的代码:

return (0...@numWeapons).to_a.permutation(@numGladiators)
(THIS RETURNS AN ENUMERATOR OBJECT)

return it.permutations(range(0, self.numWeapons), self.numGladiators)
(THIS RETURNS A GENERATOR OBJECT)

Tags: 代码inselfreturnifresponse条件level
1条回答
网友
1楼 · 发布于 2024-04-16 21:47:38

解决这一问题的最简单方法可能是使用置换公式计算生成的置换数,置换公式可定义为:

from math import factorial
def nPr(n, r):
    return int(factorial(n)/factorial(n-r))

但是,这要求数据是可用的,或者长度是从原始置换生成器创建的地方传递过来的。如果不是这样,出于某种原因,可以使用itertools.tee()从第一个生成器生成第二个生成器,并将其仅用于计数:

^{pr2}$

因为您已经在使用itertools这不是一个太重的解决方案,我想,但它仍然需要您浏览整个列表。不过,内存占用要小得多。在

相关问题 更多 >