[英]Check if a Python list has X number of consecutive values equal to Y
[英]Getting cumulative combinations (x choose y) for descending values of x in ordered consecutive list
我有一個簡單的列表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 的累積組合? 像階乘組合 function 之類的東西?
您可以使用組合公式輕松解決此問題。
出於這個原因,它可能被認為更像是一個數學問題,但我離題了。
我們可以使用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]
。這可能被描述為。
重要的是要注意,就這一目標本身而言,一個人可能會處理大量數字。 根據版本,這可能是一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.