【问题标题】:How to extract the elements of a deep nested tuple and put them in a list in python? [closed]python - 如何提取深度嵌套元组的元素并将它们放在python中的列表中? [关闭]
【发布时间】:2025-11-26 10:40:01
【问题描述】:

我一直在玩 Python,并编写了以下代码来查找给定范围内的所有素数,如下所示:

def get_primes(x):
    primes = []

    def is_prime(x):
        if x == 0:
            return
        else:
            for i in range(2, int(x)):
                if (x % i) == 0:
                    return is_prime(x - 1)
            else:
                return x, is_prime(x - 1)

    primes.append(is_prime(x))
    return primes


print(get_primes(int(input("Enter the range: 0 - "))))

输出是:(例如输入100)

Enter the range: 0 - 100
[(97, (89, (83, (79, (73, (71, (67, (61, (59, (53, (47, (43, (41, (37, (31, (29, (23, (19, (17, (13, (11, (7, (5, (3, (2, (1, None))))))))))))))))))))))))))]

看起来好难看。 所以,我需要一种方法来展平递归元组结构:

[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]

我使用了以下代码:

x = get_primes(100)
arr = []
arr.append(x[0][0])
arr.append(x[0][1][0])
arr.append(x[0][1][1][0])
arr.append(x[0][1][1][1][0])
arr.append(x[0][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
print(arr)

当然,这不是专业的方法。

所以,我想知道如何制作这个: [97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]

来自这个: [(97, (89, (83, (79, (73, (71, (67, (61, (59, (53, (47, (43, (41, (37, (31, (29, (23, (19, (17, (13, (11, (7, (5, (3, (2, (1, None))))))))))))))))))))))))))]

我在How to flatten a tuple in python 找到了答案,但是那里的代码是针对 python 2 的,所以我稍微修改了一下。

并使用了这段代码:

def flatten(T):
    if type(T) is not tuple:
        return (T,)
    elif len(T) == 0:
        return ()
    else:
        return flatten(T[0]) + flatten(T[1:])

【问题讨论】:

  • 为什么is_prime 甚至返回一个元组?它应该返回一个布尔值
  • 你可以发布处理和展平:*.com/questions/2158395/… 并修复你的缩进
  • 我不明白你的is_prime() 功能。当if (x % i) == 0 为真时,你知道 x 不是素数,那你为什么还要继续呢?
  • 另外——有什么特别的理由可以在这里尝试使用递归吗?这不是必需的,也不会扩展。
  • is_prime 函数将查找特定范围内的所有素数并返回所有这些数字,它检查 x 的当前值是否为素数,如果是素数则返回此值并调用自身,否则它只会调用自身而不返回 x 的值(应该只是素数)。

标签: python tuples


【解决方案1】:

你可以很容易地将你的函数调整为generator

def is_prime(x):
    if x != 0:
        for i in range(2, int(x)):
            if (x % i) == 0:
                yield from is_prime(x - 1)
                return
        else:
            yield x
            yield from is_prime(x - 1)

然后,要使所有素数达到 100,您可以将该生成器传递给 list,以获取包含来自该生成器的值的列表:

print(list(is_prime(100)))
# [97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]

虽然递归并不是解决这个问题的好方法,但我建议查找Sieve of Eratosthenes 以获得更好的方法。

yield from 语法仅适用于较新版本的 Python (>= 3.3)。你可以替换

yield from x

for y in x:
    yield y

如有必要。

【讨论】:

  • 感谢您的澄清,这绝对是在特定范围内生成这些素数的更好方法,但我的问题是如何从返回的列表中获取这些值:[(97, (89, (83, (79, (73, (71, (67, (61, (59, (53, (47, (43, (41, (37, (31, (29, (23, (19, (17, (13, (11, (7, (5, (3, (2, (1, None))))))))))))))))))))))))))]跨度>
【解决方案2】:

如果您创建一个嵌套元组,那么扁平化它的唯一方法是解包。最好的办法就是不创建一个。 这是您的代码的替代版本:

def get_primes(limit):

    def is_prime(x):
        if x in (2, 3):
            return True
        if (x % 2 == 0) or (x % 3 == 0):
            return False
        i, w = 5, 2
        while i**2 <= x:
            if x % i == 0:
                return False
            i += w
            w = 6 - w
        return True

    return [x for x in range(2, limit + 1) if is_prime(x)]

print(get_primes(int(input("Enter the range: 0 - "))))

【讨论】:

    最近更新 更多