获取有序连续lis中x的降序值的累积组合(x选择y)

2024-04-26 05:20:12 发布

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

我有一个简单的列表list = [0,1,2,3,4,5,6,7,8,9,10,11,12]。对于列表中的任何值x(其中x>;=4以避免错误),我需要为每个值y获取可能的“选择4”组合的累计数,其中y < x。你知道吗

例如,对于x = list[7],我想得到所有累积的计数,选择4个组合作为数字<;=7、6、5和4,即7c4、6c4、5c4和4c4。这些值分别为35、15、5和1,因此累积计数为56。你知道吗

我可以通过简单的循环和获得组合来做到这一点:

import operator as op
from functools import reduce

def ncr(n, r):
    r = min(r, n-r) 
    numer = reduce(op.mul, range(n, n-r, -1), 1)
    denom = reduce(op.mul, range(1, r+1), 1)
    return numer / denom

cumu_comb = 0
for i in list[:3:-1]:
    cumu_comb += ncr(i - 1, len(list) - i)

这感觉像是一个缓慢/暴力的方法;有数百万次的迭代,这将不是理想的方法。是否有一个数学表示法来计算所有值的累积组合<;x?像阶乘组合函数?你知道吗


Tags: 方法importltreduce列表rangelist计数
1条回答
网友
1楼 · 发布于 2024-04-26 05:20:12

你可以用组合公式很容易地解决这个问题。你知道吗

出于这个原因,这可能更像是一个maths问题,但我离题了。你知道吗

我们可以使用math.factorial()而不是使用循环来查找数字的阶乘;因为这使用C实现,所以速度会快得多。你知道吗

我们也可以使用列表理解将其填充到一行中,尽管我将输入和输出分开放置,它们可以组合在一起。请记住,我不会提出一种方法来防止此代码中的错误,因为问题意味着我们应该能够假设所有x都大于4。你知道吗

要找到累积计数,我们可以写:

import math

x = int(input("x: "))
a = sum([math.factorial(i)/(math.factorial(4) * math.factorial(i - 4)) for i in n[4:x+1]])
print(a)

例如,如果我们将x输入为7:

  • 我们将遍历列表[4, 5, 6, 7]。你知道吗
  • 对于这些元素中的每一个,我们执行组合公式,k=4(如问题中所述,尽管这可以根据情况而改变,只需改变4s)。由于我们的列表迭代,这会进入一个列表。你知道吗
  • 最后把所有的元素加起来。你知道吗

这可以说是。你知道吗

需要注意的是,在这个目标本身中,一个人可能会处理大量的数据。根据版本的不同,这可能是一个问题。

相关问题 更多 >

    热门问题