【问题标题】:Prime numbers and tuples素数和元组
【发布时间】:2020-03-02 04:59:48
【问题描述】:

我是 python 的初学者,我正在解决一个我无法解决的问题。

我应该做什么:创建一个带有素数的元组列表,范围是两个数字(也是素数)和其中的元组列表应该只包含 2 个素数 p 和 p+2

例如:给定范围 (11, 31) 返回列表 = [(11, 13), (17, 19), (29, 31)]

这是我的代码

def twin_primes(a: int, b:int) -> List[Tuple[int, int]]:

    list_primes = []
    list_final = []
    for val in range (a, b+1):
        if val > 1 :
            for n in range(2, val):
                if (val % n) == 0:
                    break
            else:
                list_primes.append(val)
    for val in list_primes:
        print(val)
        list_final.append((list_primes[val], list_primes[val + 2]))
    return list_final

print(twin_primes(11,31))

在第一个 for 循环中,我确定该范围内的哪些数字是素数并将它们附加到 list_primes

在第二个循环中,我尝试从list_primes 中获取质数并将它们作为元组附加到list_final

它告诉我这个:

list_final.append((list_primes[val], list_primes[val + 2]))
IndexError: 列表索引超出范围*

有人可以帮我解决这个问题吗?我想我理解这个错误,但我不知道如何修复代码,所以它只需将pp+2 放入一个元组,然后再放入另一对等等......它也必须忽略23,尽管它是质数。

【问题讨论】:

  • 您期望list_primes[val] 是什么? vallist_primes 的一个元素,而不是列表中的索引。
  • 你应该先做一些基本的调试:print (val)就在错误点之前是“明显”的首选。
  • 是的,我希望它是 list_primes 的一个元素,这就是为什么我尝试将它附加到 list_final ....我认为 (list_primes[val], list_primes[val + 2]) 会制作一个 p 和 p+2 的元组

标签: python list tuples primes


【解决方案1】:

val 不是list_primes 的索引,它是它的一个元素。您需要将包含valval+2 的元组附加到list_final,但前提是val+2 在素数列表中。

for val in list_primes:
    if val+2 in list_primes:
        list_final.append((val, val+2))

这可以使用enumerate() 进行改进,因为val+2 总是会成为下一个素数(如果存在)。

for i, val in enumerate(list_primes[:-1]):
    if list_primes[i+1] == val + 2:
        list_final.append((val, val+2))

【讨论】:

  • 非常感谢您的回答,现在我明白我在哪里犯了错误,我明白它应该是 == 而不是 = :D
【解决方案2】:

您对双胞胎进行迭代的逻辑不正确。 val 设置为列表本身的元素,而不是索引。您将其视为索引。您需要遍历数字的范围,而不是元素本身。我建议使用步长为 2 的范围。

list_primes = []
list_final = []
for val in range (a, b+1):
    if val > 1 :
        for n in range(2, val):
            if (val % n) == 0:
                break
        else:
            list_primes.append(val)

for i in range(0, len(list_primes) - 1, 2):
    list_final.append((list_primes[i], list_primes[i + 1]))
return list_final

当 a = 11 和 b = 31 时,这会产生 [(11, 13), (17, 19), (23, 29)]

但是你的逻辑仍然需要一些调整,因为当 a = 50 和 b = 100 时,这会产生 [(53, 59), (61, 67), (71, 73), (79, 83), (89, 97)],显然这是不正确的。

【讨论】:

  • 谢谢你的称赞,我知道该怎么做了
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2018-06-14
  • 2015-09-20
相关资源
最近更新 更多