Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 消除连续数_Python - Fatal编程技术网

Python 消除连续数

Python 消除连续数,python,Python,如果你有一系列从1到49的数字,有6个数字可供选择,那么有将近1400万个组合。使用我当前的脚本,我目前只剩下720万个组合。在剩下的720万个组合中,我想消除所有3、4、5、6、双和三个连续数字。 例如: 连续3次:1,2,3,x,x,x 连续4次:3、4、5、6、x、x 连续5次:4,5,6,7,8,x 连续6次:5、6、7、8、9、10 双分离连续:1,2,5,6,14,18 连续三次分开:1,2,9,10,22,23 注:1、2、12、13、14、15等组合也必须消除,否则它们与消除

如果你有一系列从1到49的数字,有6个数字可供选择,那么有将近1400万个组合。使用我当前的脚本,我目前只剩下720万个组合。在剩下的720万个组合中,我想消除所有3、4、5、6、双和三个连续数字。 例如:

  • 连续3次:1,2,3,x,x,x
  • 连续4次:3、4、5、6、x、x
  • 连续5次:4,5,6,7,8,x
  • 连续6次:5、6、7、8、9、10
  • 双分离连续:1,2,5,6,14,18
  • 连续三次分开:1,2,9,10,22,23
注:1、2、12、13、14、15等组合也必须消除,否则它们与消除两个或三个连续组合的规则相冲突

我想知道剩余720万个组合中有多少个组合具有零个连续数字(全部混合),而只有一个连续对

谢谢大家!

导入工具
_最小和=120
_最大和=180
_最小数量=1
_最大数量=49
_选择数=6
_最小赔率=2
_最大赔率=4
@functools.lru\u缓存(maxsize=None)
def f(n,l,s=0,赔率=0):
如果s>\u MAX\u总和或赔率>\u MAX\u赔率:
返回0
如果n==0:
返回整数(s>=\u最小值与赔率>=\u最小值与赔率)
范围(l,_MAX_NUM+1)内i的返回和(f(n-1,i+1,s+i,赔率+i%2))
结果=f(\u NUM\u选项,\u MIN\u NUM)
打印('选择数={}'。格式(结果))

虽然我的答案应该有效,但我认为有人可能会提供更快的解决方案

考虑以下代码:

not_allowed = []
for x in range(48):
    not_allowed.append([x, x+1, x+2])

# not_allowed = [ [0,1,2], [1,2,3], ... [11,12,13], ... [47,48,49] ]
my_numbers = [[1, 2, 5, 9, 11, 33], [1, 3, 7, 8, 9, 31], [12, 13, 14, 15, 23, 43]]
for x in my_numbers:
    for y in not_allowed:
        if set(y) <= set(x): # if [1,2,3] is a subset of [1,2,5,9,11,33], etc.
            # drop x
不允许=[]
对于范围(48)内的x:
不允许。追加([x,x+1,x+2])
#不允许=[0,1,2],[1,2,3],…[11,12,13],…[47,48,49]]
我的数字=[[1,2,5,9,11,33],[1,3,7,8,9,31],[12,13,14,15,23,43]]
对于my_编号中的x:
对于不允许的y输入:

如果设置(y)最简单的方法可能是生成和过滤。我使用numpy尝试尽可能多地将其矢量化:

import numpy as np
from itertools import combinations
combos = np.array(list(combinations(range(1, 50), 6)))  # build all combos
# combos is shape (13983816, 6)
filt = np.where(np.bincount(np.where(np.abs(
    np.subtract(combos[:, :-1], combos[:, 1:])) == 1)[0]) <= 1)[0]  # magic!
filtered = combos[filt]
# filtered is shape (12489092, 6)
将numpy导入为np
从itertools导入组合
combos=np.array(列表(组合(范围(1,50,6))#构建所有组合
#组合是形状(13983816,6)
filt=np.where(np.bincount)(np.where)(np.abs(

np.subtract(组合符[:,:-1],组合符[:,1:])==1[0])我认为这有点奇怪。听起来你只是想得到只有一对连续组合的所有组合,那么为什么不重新表述这个问题来询问你想要的结果呢?如果你澄清了这一点,我们可能能够更有效地帮助你。与其寻找上述6个组合,不如检查一下有连续组合的组合零个连续数字(全部混合)或者只有1个连续对。我需要所有组合,其中只有一个连续对,并且在6的选择中也有零个连续数字。因此,所有其他组合都将被消除。因此,为了澄清,您需要长度为6的数组的数量,这些数组只包含1-49的值,并且最多只包含1对连续数字s?我同意@Engineero的观点,即最好将问题改写为明确说明您希望组合的数量最多为一对连续数字,并且最好将问题发布到,因为这是一个组合问题,允许一对连续数字,因此
[1、2、5、9、11、33
]`很好,明白了,我误解了你的问题。所有这些都需要代码中的一个简单修复,我现在可以更新。很抱歉再次更正你,但你的更新也不正确。现在
[1,2,5,6,11,33]
将被接受。你是对的,不用担心纠正我。让我考虑一下,看看我是否可以在下班后进一步修改,并给出更全面的答案。还要注意算法的复杂性。尽量减少必要的迭代次数