我想将列表中的项目放在表的顺序索引处,列数由输入控制。我知道如何通过在每列末尾增加或重置整数来以“无聊”的方式做到这一点,但我认为使用 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给了我们行号。
添加回答
举报
0/150
提交
取消