【问题标题】:How to display a long list of numbers in rows and columns? [duplicate]如何在行和列中显示一长串数字? [复制]
【发布时间】:2017-09-21 01:03:17
【问题描述】:

我正在尝试从我在第一个函数中创建的列表中打印第二个函数中的表。我当前的代码在打印到控制台时没有正确排列,并且它还按从“左到右”的顺序在每一行而不是“从上到下”在每一列中打印。我不知道我需要在 displayPrimes() 函数中更改什么。

def findPrimes(n):
    prime_list = [2]

    for number in range(3, n, 2):
        if all(number % i != 0 for i in range(2, int(number ** .5) + 1)):
            prime_list.append(number)

    return prime_list

def displayPrimes():
    for row in findPrimes(4027):
        for col in findPrimes(4027):
            product = row * col
            print(product, end = "\t")
            break

# main program
findPrimes(4027)
displayPrimes()

【问题讨论】:

  • 而不是使用标签,这可能会有所帮助:stackoverflow.com/questions/5676646/…
  • 我很感激,但我需要使用嵌套的 for 循环。该链接包含我尚未学习且无法使用的内容。我不是要求人们为我做这件事,只是为了帮助我弄清楚。
  • 请问你想在屏幕上显示什么?
  • 我想按顺序显示列表的行和列。它不必是特定数量的行或列,但我只需要整齐地打印列表。

标签: python list for-loop indexing nested


【解决方案1】:
def findPrimes(n):
    prime_list = [2]
    for number in range(3, n, 2):
        if all(number % i != 0 for i in range(2, int(number ** .5) + 1)):
            prime_list.append(number)
    return prime_list

def displayPrimes(number, rows=100):
    result_list = [[] for _ in range(rows)]
    primes = findPrimes(number)
    for idx, item in enumerate(primes):
        row_idx = idx % rows
        result_list[row_idx].append("%6d" % item)

    result_str = '\n'.join(['\t'.join(i) for i in result_list])
    return result_str

print(displayPrimes(4027))

【讨论】:

  • 这非常正确,但是数字是按从左到右的顺序打印的,而不是从上到下的列。不过我会试着弄清楚。感谢您的帮助。
  • 我已经改过了。请检查一下。
  • 太完美了!我很感激!
【解决方案2】:

我有一个解决方案,对于初学者来说可能不太容易理解,但它允许您指定列数。

在 itertools 文档中有一个 grouper recipe,您可以使用它来将一个可迭代对象拆分为 n 个大小的组/元组。如果您计算出每列有多少项 (items_per_column = math.ceil(len(primes)/columns)),您可以将此数字传递给 grouper,然后使用此 zip 技巧转置返回的可迭代对象:zip(*iterable)。下面是这个成语的演示:

>>> lst = [(1,2,3), (4,5,6)]
>>> list(zip(*lst))
[(1, 4), (2, 5), (3, 6)]

解决办法:

import math
from itertools import zip_longest


def findPrimes(n):
    prime_list = [2]
    for number in range(3, n, 2):
        if all(number % i != 0 for i in range(2, int(number ** .5) + 1)):
            prime_list.append(number)
    return prime_list


def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)


def prime_table(number, columns=8):
    """Rearrange the primes into top to bottom columns."""
    primes = findPrimes(number)
    # Figure out how many items fit into one column.
    items_per_column = math.ceil(len(primes)/columns)  # Round up.
    # `grouper` splits the list into tuples of length items_per_column.
    # Then transpose the groups with `zip(*iterable)`, so that
    # the primes are arranged top to bottom.
    return zip(*grouper(primes, items_per_column, ''))


def print_table(rows):
    for row in rows:
        for item in row:
            print('{:>6}\t'.format(item), end='')
        print()


print_table(prime_table(4027))

打印超过 10 列或非常大的数字会使表格混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 2014-04-21
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多