为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2022-01-18 16:04:31
我想将列表中的项目放在表的顺序索引处,列数由输入控制。我知道如何通过在每列末尾增加或重置整数来以“无聊”的方式做到这一点,但我认为使用 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维吗?
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

看起来你可以使用repeat。


from itertools import chain, repeat


def 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, item


items = ["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给了我们行号。


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信