Python 识别数字列表中的算术级数

Python 识别数字列表中的算术级数,python,math,Python,Math,M个算术级数,每个级数有N个项(各项不同于d1、d2、…dm),作为输入传递,各项被洗牌。程序必须按顺序打印M个算术级数中的项,首先打印最小的起始项 示例输入/输出1: Input: 2 1 4 8 12 7 16 Output: 1 4 7 8 12 16 Explanation: There are two progressions. Hence 6/2 = 3 terms in each progression. So the first A.M has 1 4 7 and

M个算术级数,每个级数有N个项(各项不同于d1、d2、…dm),作为输入传递,各项被洗牌。程序必须按顺序打印M个算术级数中的项,首先打印最小的起始项

示例输入/输出1:

Input: 2
       1 4 8 12 7 16 
Output: 1 4 7 8 12 16
Explanation: There are two progressions. Hence 6/2 = 3 terms in each progression. So the first A.M has 1 4 7 and the second has 8 12 16 As 1 < 8, 1 4 7 is printed followed by 8 12 16
说明:有三种进展。因此,在每个级数中,9/3=3项。第一个上午有246,第二个上午有81522。第三个有10 11 12。注意:我们不能将8 10 12作为第二个级数,因为剩余的数字11 15 22不适用于算术级数`

我想到了一种方法,首先对数字进行排序,然后生成一个列表,其中包含每个数字与其他数字之间的差异

inp=raw_input()
inputList=[int(c) for c in inp]
inputList.sort()
for i in range(0,len(inputList)):
   for j in range(0,len(inputList)):
      if(i!=j): #To avoid zeros
         newlist.append(abs(inputList[j]-inputList[i]))

然后,将每个数字映射到另一个列表中相同的位置。因此,可以识别序列。但是没有成功。有没有更好的方法来解决这个问题(最好是Python)?

在按降序排序后,通过检查元素是否是算术级数,然后使用计数器dict跟踪哪些元素被用于处理应添加的内容,可以得到列表的组合:

def arith_seq(l, m):
    l.sort(reverse=True)
    terms = len(l) // m
    combs = filter(lambda x: all((x[i + 1] - x[i] == x[1] - x[0]
                                       for i in range(len(x) - 1))), combinations(l, terms))
    out = []
    from collections import Counter
    cn = Counter(l)
    for ele in combs:
        if all(cn[c] > 0 for c in ele):
            out.append(ele[::-1])
            for c in ele:
                cn[c] -= 1
    out.sort()
    return out
使用您的输入:

In [6]: inp = 3

In [7]: l = map(int,"2 6 8 10 15 22 12 11 4".split())

In [8]: arith_seq(l,inp)
Out[8]: [(2, 4, 6), (8, 15, 22), (10, 11, 12)]

按降序排序后,通过检查元素是否为算术级数,然后使用计数器记录用于处理应添加内容的元素,可以获得列表的组合:

def arith_seq(l, m):
    l.sort(reverse=True)
    terms = len(l) // m
    combs = filter(lambda x: all((x[i + 1] - x[i] == x[1] - x[0]
                                       for i in range(len(x) - 1))), combinations(l, terms))
    out = []
    from collections import Counter
    cn = Counter(l)
    for ele in combs:
        if all(cn[c] > 0 for c in ele):
            out.append(ele[::-1])
            for c in ele:
                cn[c] -= 1
    out.sort()
    return out
使用您的输入:

In [6]: inp = 3

In [7]: l = map(int,"2 6 8 10 15 22 12 11 4".split())

In [8]: arith_seq(l,inp)
Out[8]: [(2, 4, 6), (8, 15, 22), (10, 11, 12)]

可能重复@freakish No。该问题有一个固定的限制,每个级数只有3个数字。在这里,每个级数中的数字可以大于或等于3个,并且输入中最多可以有5个级数。@Tommy算法的问题是明确的主题per。此外,考虑到asker正在寻找该算法的Python实现,我想说,这对于程序员来说是离题的,但是在这里,在范围上有一些重叠。在这种情况下,您不会迁移。@Tommy
icanhazcodez
在这两个站点上的问题都是无关紧要的。他们可能更适合这里。可能重复@freakish No。这个问题有一个固定的限制,每个级数只有3个数字。在这里,每个级数中的数字可以大于或等于3个,并且输入中最多可以有5个级数。@Tommy算法的问题是明确的主题per。此外,考虑到asker正在寻找该算法的Python实现,我想说,这对于程序员来说是离题的,但是在这里,在范围上有一些重叠。在这种情况下,您不会迁移。@Tommy
icanhazcodez
在这两个站点上的问题都是无关紧要的。他们可能更适合这里。