首页 > 解决方案 > 以最少的行和列打印列表

问题描述

寻找素数的代码:

def findPrimes(n):

    prime_list = list()
    for number in range(1, n + 1):
        prime = True
        for i in range(2, number):
            if(number % i == 0):
                prime = False
        if prime:
            prime_list.append(number)

    return prime_list

整齐地制作素数列表的代码:

def displayPrimes(number, rows = 50):

    table_list = [[] for _ in range(rows)]
    primes = findPrimes(number)

    for index, item in enumerate(primes):
        row_index = index % rows
        table_list[row_index].append("%6d" % item)

    table_str = "\n".join(["\t".join(i) for i in table_list])

    return table_str
print(displayPrimes(4027))

寻找孪生素数的代码:

def findTwinPrimes(n):
     prime = [True for i in range(n + 2)] 
     p = 2

     while (p * p <= n + 1): 

        # If prime[p] is not changed,  
        # then it is a prime 
        if (prime[p] == True): 

            # Update all multiples of p 
            for i in range(p * 2, n + 2, p): 
                prime[i] = False
        p += 1

    # check twin prime numbers 
    # display the twin prime numbers 
        for p in range(2, n-1): 
            if prime[p] and prime[p + 2]: 
                print("(",p,",", (p + 2), ")" ,end='')

print(findTwinPrimes(4027))  

使孪生素数显示整齐的代码。问题是它说:

TypeError:“函数”对象不可迭代

因为我在用于显示素数的代码中有相同的数据,所以这不起作用,它只是整齐地显示列表?

def displayTwinPrimes(number, rows = 52):

    table_list = [[] for _ in range(rows)]
    twinPrimes = findTwinPrimes

    for index, item in enumerate(twinPrimes):
        row_index = index % rows
        table_list[row_index].append("%6d" % item)

    table_str = "\n".join(["\t".join(i) for i in table_list])    

    return table_str

print(displayTwinPrimes(4027)) 

标签: pythonfunctionprimes

解决方案


您需要重构代码以查找孪生数,如下所示。

此方法返回孪生素数元组列表,[(3,5),(5,7), ...]

def findTwinPrimes(n):
    prime = [True for i in range(n + 2)]
    p = 2
    twin_primes = []
    while (p * p <= n + 1):

        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == True):

            # Update all multiples of p
            for i in range(p * 2, n + 2, p):
                prime[i] = False
        p += 1

    # check twin prime numbers
    # display the twin prime numbers
    for p in range(2, n - 1):
        if prime[p] and prime[p + 2]:
            twin_primes.append((p, (p + 2)))
            print("(", p, ",", (p + 2), ")", end='')

    return twin_primes  # this returns twin_primes as list of tuples i.e [(3,5),(5,7), ...]

您还需要翻新您的displayTwinPrimes方法,如下所示:

def displayTwinPrimes(number, rows = 52):

    table_list = [[] for _ in range(rows)]
    twinPrimes = findTwinPrimes(number)

    for index, item in enumerate(twinPrimes):
        row_index = index % rows
        table_list[row_index].append(item)

    table_str = "\n".join(["\t".join(["(%6d, %6d)" % (p[0],p[1]) for p in i]) for i in table_list])

    return table_str

推荐阅读