首页 > 解决方案 > 浏览列表,每当出现特定类别的数字时,创建其他类别的最新数字列表

问题描述

假设我有一个随机数列表

随机列表 = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14 , 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4 , 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16 , 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6 , 8]

数字分为三类: 可以被两个(2,4,6,8,10,12,14,16,18,20)素数整除的数字,除了两个(3,7,11,13,17,19) ) 休息 (1,5,9,15)

现在我想做的是以下内容:我将浏览列表,每当出现一些其余类别时,我想创建一个像这样 [%2, prime] 的列表,而元素是最近出现的元素名单。目标是拥有一个包含两个元素的列表。我希望它清楚我想要做什么。这是我的代码:

randomlist = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14, 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4, 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16, 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6, 8]


def check_prime(x):

    for i in range(2, x):
        if (x % i) == 0:
            return False
    else:
        return True

def check_number(x):

    if x%2 == 0:
        return "zweier"

    elif check_prime(x) == True:
        return "prim"

    else:
        return "rest"

final_list = []
partial_list = [0,0]

for x in randomlist:

    if check_number(x) =="zweier":
        partial_list[0] = x

    elif check_number(x) == "rest":
        partial_list[1] = x

    else:
        final_list.append(partial_list)

for x in final_list:
    print(x)

输出:

[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]

让我非常困惑的是,如果我在创建 final_list 成员后立即打印它们,它会显示正确的解决方案:

randomlist = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14, 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4, 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16, 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6, 8]


def check_prime(x):
    for i in range(2, x):
        if (x % i) == 0:
            return False
    else:
        return True

def check_number(x):

    if x%2 == 0:
        return "zweier"

    elif check_prime(x) == True:
        return "prim"

    else:
        return "rest"

final_list = []
partial_list = [0,0]

for x in randomlist:

    if check_number(x) =="zweier":
        partial_list[0] = x

    elif check_number(x) == "rest":
        partial_list[1] = x

    else:
        final_list.append(partial_list)
        print(final_list[-1])

输出:

[18, 9]
[18, 9]
[18, 9]
[18, 9]
[4, 9]
[4, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[14, 9]
[20, 9]
[8, 9]
[8, 9]
[12, 9]
[2, 15]
[14, 15]
[14, 15]
[14, 15]
[2, 15]
[4, 15]
[4, 15]
[4, 15]
[18, 15]
[18, 15]
[18, 15]
[14, 9]
[14, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[14, 9]
[14, 9]
[14, 9]
[6, 9]
[14, 9]
[18, 9]

所以看起来基本的想法是可以的。我尝试了很多,但我无法找出我做错了什么。非常感谢您的帮助!

标签: pythonfor-loop

解决方案


这样做的原因是,当您遍历 randomlist 中的项目并将 partial_list 附加到 final_list 时,您附加的是对同一对象 (partial_list) 的引用,而不是包含的值。

如果将 append 语句更改为:

final_list.append(partial_list.copy())

每次都会附加一个 partial_list 的副本,您的代码最终将打印正确的结果。

因此,您的代码将是:

def check_prime(x):

    for i in range(2, x):
        if (x % i) == 0:
            return False
    else:
        return True

def check_number(x):

    if x%2 == 0:
        return "zweier"

    elif check_prime(x) == True:
        return "prim"

    else:
        return "rest"

final_list = []
partial_list = [0,0]

for x in randomlist:

    if check_number(x) =="zweier":
        partial_list[0] = x

    elif check_number(x) == "rest":
        partial_list[1] = x
    else:
        final_list.append(partial_list.copy())

for x in final_list:
    print(x)

推荐阅读