Python 如何在列表中使用或添加各种数字来按一计数?

Python 如何在列表中使用或添加各种数字来按一计数?,python,list,add,Python,List,Add,我以前曾发布过这篇文章,但它令人困惑。为了让它更清楚,我会尽量解释得更好一点 执行我的代码会创建一个包含以下值的列表:[2,2,3,4,6,9,14,22,35,56,90],这就是我添加到列表中的顺序。我想用这些值计算1。所以,从2开始,我需要能够永远数到1。例如,要数到2(起始位置),我在列表中选择值2并将其添加到另一个列表中。数到3,我用3。数到4,我用4。但是,要数到5,因为5实际上不在列表中,我需要将2和3加在一起,然后将结果添加到列表中。我希望能够对超过1的所有值(从2开始)执行此操

我以前曾发布过这篇文章,但它令人困惑。为了让它更清楚,我会尽量解释得更好一点

执行我的代码会创建一个包含以下值的列表:
[2,2,3,4,6,9,14,22,35,56,90]
,这就是我添加到列表中的顺序。我想用这些值计算1。所以,从2开始,我需要能够永远数到1。例如,要数到2(起始位置),我在列表中选择值2并将其添加到另一个列表中。数到3,我用3。数到4,我用4。但是,要数到5,因为5实际上不在列表中,我需要将2和3加在一起,然后将结果添加到列表中。我希望能够对超过1的所有值(从2开始)执行此操作。最重要的是要明白,我只是想证明我能做到这一点。它不是一个功能计数器,而是一个概念证明

该列表是通过将前两个数字相加得到第三个数字,然后将该数字减去1来创建的

代码如下:

def main():
    x = 2
    y = 2
    z = (x + y) - 1

    print x
    print y

    times = 10
    count = 0

    while times > 0:

        if count == 0:
            seq_list = []
            seq_list.extend([x, y])
            print seq_list
            count = 1
        else:
            seq_list.append(y)
            print seq_list

        z = (x + y) - 1
        x = y
        y = z

        print z
        times -= 1

main()

此代码输出单独创建的每个值,以及包含以前创建的每个数字的列表。这就创建了一个列表:
[2,2,3,4,6,9,14,22,35,56,90,…]
[(2+2)-1]=3,[(2+3)-1]=4
,等等。

如果我理解正确,那么一个简单的解决方案就是收集集合中所有可能的组合,然后检查它是否是一个完整的数字序列:

>>> import itertools
>>> l =  [2, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90]
>>> s = set()
>>> for i in range(len(l)):
...     for comb in itertools.combinations(l, i+1):
...         s.add(sum(list(comb)))
>>> sorted(s)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 243]
如您所见,
242
是唯一无法通过对列表成员求和获得的数字:

>>> [i for i in range(2,244) if i not in s]
[242]

当然,这种方法完全是蛮力-小列表没有问题,但它不能很好地扩展到大列表。

如果我理解正确,那么一个简单的解决方案就是收集集合中所有可能的组合,然后检查它是否是一个完整的数字序列:

>>> import itertools
>>> l =  [2, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90]
>>> s = set()
>>> for i in range(len(l)):
...     for comb in itertools.combinations(l, i+1):
...         s.add(sum(list(comb)))
>>> sorted(s)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 243]
如您所见,
242
是唯一无法通过对列表成员求和获得的数字:

>>> [i for i in range(2,244) if i not in s]
[242]

当然,这种方法完全是蛮力-小列表没有问题,但它不能很好地扩展到大列表。

如果我理解正确,那么一个简单的解决方案就是收集集合中所有可能的组合,然后检查它是否是一个完整的数字序列:

>>> import itertools
>>> l =  [2, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90]
>>> s = set()
>>> for i in range(len(l)):
...     for comb in itertools.combinations(l, i+1):
...         s.add(sum(list(comb)))
>>> sorted(s)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 243]
如您所见,
242
是唯一无法通过对列表成员求和获得的数字:

>>> [i for i in range(2,244) if i not in s]
[242]

当然,这种方法完全是蛮力-小列表没有问题,但它不能很好地扩展到大列表。

如果我理解正确,那么一个简单的解决方案就是收集集合中所有可能的组合,然后检查它是否是一个完整的数字序列:

>>> import itertools
>>> l =  [2, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90]
>>> s = set()
>>> for i in range(len(l)):
...     for comb in itertools.combinations(l, i+1):
...         s.add(sum(list(comb)))
>>> sorted(s)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 243]
如您所见,
242
是唯一无法通过对列表成员求和获得的数字:

>>> [i for i in range(2,244) if i not in s]
[242]

当然,这种方法完全是蛮力的-小列表没有问题,但它不能很好地扩展到较大的列表。

这里您可以看到,哪种组合导致哪种总和:

from itertools import combinations
from collections import defaultdict
def main():
    x = y = 2
    seq_list = [x]
    for _ in range(10):
        x, y = y, (x + y) - 1
        seq_list.append(x)
    print seq_list

    result = defaultdict(list)
    for i in range(1, 1 + len(seq_list)):
        for comb in combinations(seq_list, i):
            result[sum(comb)].append(comb)
    for k in sorted(result):
        print k, result[k]

if __name__ == '__main__':
    main()

在这里,您可以看到,哪些组合导致了哪些总和:

from itertools import combinations
from collections import defaultdict
def main():
    x = y = 2
    seq_list = [x]
    for _ in range(10):
        x, y = y, (x + y) - 1
        seq_list.append(x)
    print seq_list

    result = defaultdict(list)
    for i in range(1, 1 + len(seq_list)):
        for comb in combinations(seq_list, i):
            result[sum(comb)].append(comb)
    for k in sorted(result):
        print k, result[k]

if __name__ == '__main__':
    main()

在这里,您可以看到,哪些组合导致了哪些总和:

from itertools import combinations
from collections import defaultdict
def main():
    x = y = 2
    seq_list = [x]
    for _ in range(10):
        x, y = y, (x + y) - 1
        seq_list.append(x)
    print seq_list

    result = defaultdict(list)
    for i in range(1, 1 + len(seq_list)):
        for comb in combinations(seq_list, i):
            result[sum(comb)].append(comb)
    for k in sorted(result):
        print k, result[k]

if __name__ == '__main__':
    main()

在这里,您可以看到,哪些组合导致了哪些总和:

from itertools import combinations
from collections import defaultdict
def main():
    x = y = 2
    seq_list = [x]
    for _ in range(10):
        x, y = y, (x + y) - 1
        seq_list.append(x)
    print seq_list

    result = defaultdict(list)
    for i in range(1, 1 + len(seq_list)):
        for comb in combinations(seq_list, i):
            result[sum(comb)].append(comb)
    for k in sorted(result):
        print k, result[k]

if __name__ == '__main__':
    main()

如果您对这些组合不感兴趣,那么您可以使用以下命令打印使用序列可以访问的所有数字

def check_sum(a, b, stop, total):
    return a == total or (a < total and b <= stop and 
        (check_sum(b, a + b - 1, stop, total - a) or check_sum(b, a + b - 1, stop, total)))

print [i for i in range(244) if check_sum(2, 2, 90, i)]

如果您对这些组合不感兴趣,那么您可以使用以下命令打印使用序列可以访问的所有数字

def check_sum(a, b, stop, total):
    return a == total or (a < total and b <= stop and 
        (check_sum(b, a + b - 1, stop, total - a) or check_sum(b, a + b - 1, stop, total)))

print [i for i in range(244) if check_sum(2, 2, 90, i)]

如果您对这些组合不感兴趣,那么您可以使用以下命令打印使用序列可以访问的所有数字

def check_sum(a, b, stop, total):
    return a == total or (a < total and b <= stop and 
        (check_sum(b, a + b - 1, stop, total - a) or check_sum(b, a + b - 1, stop, total)))

print [i for i in range(244) if check_sum(2, 2, 90, i)]

如果您对这些组合不感兴趣,那么您可以使用以下命令打印使用序列可以访问的所有数字

def check_sum(a, b, stop, total):
    return a == total or (a < total and b <= stop and 
        (check_sum(b, a + b - 1, stop, total - a) or check_sum(b, a + b - 1, stop, total)))

print [i for i in range(244) if check_sum(2, 2, 90, i)]


我还是不明白这个问题。请确切地告诉我们你想要的结果是什么。换句话说,你想证明你可以通过添加列表中的一些或所有数字来构建2到x之间的所有数字?你怎么知道你甚至可以?我能想到很多列表,其中没有任何元素组合能满足您的标准。发布一个输入和输出示例。这将解释问题本身,你不需要解释任何东西。我认为这与麦克纳金的数字相似,我仍然不理解这个问题。请确切地告诉我们你想要的结果是什么。换句话说,你想证明你可以通过添加列表中的一些或所有数字来构建2到x之间的所有数字?你怎么知道你甚至可以?我能想到很多列表,其中没有任何元素组合能满足您的标准。发布一个输入和输出示例。这将解释问题本身,你不需要解释任何东西。我认为这与麦克纳金的数字相似,我仍然不理解这个问题。请确切地告诉我们你想要的结果是什么。换句话说,你想证明你可以通过添加列表中的一些或所有数字来构建2到x之间的所有数字?你怎么知道你甚至可以?我能想到很多列表,其中没有任何元素组合能满足您的标准。发布一个输入和输出示例。这将解释问题本身,你不需要解释任何东西。我认为这与麦克纳金的数字相似,我仍然不理解这个问题。请确切地告诉我们你想要的结果是什么。换句话说,你想证明你可以通过添加列表中的一些或所有数字来构建2到x之间的所有数字?你怎么知道你甚至可以?我能想到很多列表,其中没有任何元素组合能满足您的标准。发布一个输入和输出示例。它将解释问题本身,你不需要解释任何东西。我认为这类似于mcnugget数字,好吧,itertools的组合()