使用 Python 的 itertools 的二维表索引生成器

我想将列表中的项目放在表的顺序索引处,列数由输入控制。我知道如何通过在每列末尾增加或重置整数来以“无聊”的方式做到这一点,但我认为使用 Python 的itertools库可能有一种更优雅的方式来做到这一点。


考虑这个列表:


items = ["Apple", "Orange", "Pear", "Strawberry", "Banana"]

这是无聊的方式:


def table_indexes(items, ncol):

    col = 0

    row = 0


    for item in items:

        yield (col, row)

        col += 1

        if col >= ncol:

            # end of row

            col = 0

            row += 1

这将产生将项目放置在下表索引中的索引:


| Apple  | Orange     |

| Pear   | Strawberry |

| Banana |            |

我想在itertools其他地方或其他地方找到一个函数,它可以产生一系列索引对,其中每对中的一个索引重复地循环通过一系列数字(列号),并且每次第一个循环重复时另一个索引增加 1 ? 像这样:


def table_indexes(items, ncol):

    cols = ... # e.g. itertools.cycle(range(ncol))

    rows = ... # needs to be an iterator yielding sequences of [i]*ncol where i is the current row index

    yield zip(cols, rows):

解决方案可以扩展到N维吗?


慕斯王
浏览 154回答 1
1回答

交互式爱情

看起来你可以使用repeat。from itertools import chain, repeatdef table_indexes(items, ncol):    cols = chain.from_iterable(repeat(range(ncol), len(items)//ncol + 1))    for x, (col, item) in enumerate(zip(cols, items)):    yield x//ncol, col, itemitems = ["Apple", "Orange", "Pear", "Strawberry", "Banana"]list(table_indexes(items, 3))输出:[(0, 0, 'Apple'), (0, 1, 'Orange'), (0, 2, 'Pear'), (1, 0, 'Strawberry'), (1, 1, 'Banana')]更多细节,重复给我们列的列表repeat(range(ncol), len(items)//ncol + 1) --> [[0, 1, 2], [0, 1, 2]]当我们遍历项目的枚举时,构造x // ncol给了我们行号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python