如何在列表中查找特定元素并将它们组合到一个新列表中(Python3)

时间:2016-05-04 10:55:04

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

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

我已经在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,其中添加了所有双胞胎对的第一个值,以便我可以找到len(ps)来查找双胞胎的总价值。

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

1 个答案:

答案 0 :(得分: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]