【问题标题】:How to find specific elements in a list and combine them into a new list (Python3)如何在列表中查找特定元素并将它们组合成一个新列表(Python3)
【发布时间】:2016-05-04 10:55:04
【问题描述】:

首先,我是这个网站和编程的新手,所以如果我的代码编写水平不好或者我提出问题的方式有误,请指出我正确的方向。

我已经用 Python3 编写了一个程序,它使我能够获得一个包含小于我选择的给定数 N 的所有素数的列表。例如,如果我的输入是 10,我的程序将给出以下结果:

>>>primes(10)
[2, 3, 5, 7]

现在我正在尝试编写一个后续程序,它给出了给定数字 N 的孪生素数。例如:如果 N = 10,我知道有两个孪生素数 [3,5] 和 [5 ,7]。 我尝试了以下方法:

def twinprimes(n):
    x = primes(n)
    ps = [] 
    for i in range(len(x)):
        if x[i]+2==x[i]:
        ps.append((x[i])
    return ps

所以我正在尝试创建一个新列表 ps,其中添加了 twinprime 对的所有第一个值,以便我可以找到 len(ps) 以找到 twinprimes 的总值。

现在我知道我的代码有很多问题。我只是不知道如何让它工作。

【问题讨论】:

  • 想想下面的表达式:x[i]+2==x[i]。对于 any 给定的数字,这不可能是真的。 5 + 2 永远不会等于 5。也许您想用x 中的另一个数字来测试它?例如,双素数总是相邻的。
  • 除了下面给出的答案:ps.append((x[i]) 有一个太多的(,应该在if 语句下缩进

标签: python python-3.x for-loop primes


【解决方案1】:

你正在尝试测试一个素数是否等于它自己加 2:

if x[i]+2==x[i]:

没有一个数字等于它自己加上一个非零的其他数字,所以这个测试永远不会通过。

您想测试当前素数是否比列表中的下一个数小 2:

if x[i] == x[i + 1] - 2:  # two adjacent primes differ by 2

这将遇到i + 1 不是x 的有效索引的问题,因为您循环到(但不包括)len(x)len(x) + 1 将提高 IndexError。但是您无论如何都不需要测试最后一个素数,因此以下方法可以工作:

for i in range(len(x) - 1):
    if x[i]  == x[i + 1] - 2:
        ps.append((x[i], x[i + 1]))

这会添加两个素数。

有更多的pythonic方法来生成这个列表;例如,将素数与zip() 配对,并使用列表推导:

def twinprimes(n):
    x = primes(n)
    return [(a, b) for a, b in zip(x, x[1:]) if a == b - 2]

【讨论】:

  • 谢谢!我真的很喜欢最后一个选项的简单性。但是,您的第一个建议对我产生了错误(预期是缩进块)。
  • @Whizkid95:然后确保您已正确缩进您的代码。确保您不会意外混合制表符和空格(Python 将制表符扩展到每 8 个位置,仅使用空格可以避免混淆和奇怪的错误)。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多