我正在尝试将列表拆分为枚举集,并且我有一个实现似乎做我想要的但是它感觉不是很“pythonic”有更好的方法吗?
以下示例将项目拆分为最大尺寸3的集合,并从项目中返回每个项目以及设定的编号并设置索引
items = [1,2,3,4,5,6,7,8,9]
def SplitSets(iterable,set_size):
row = 0
col = 0
for elem in iterable:
yield row, col, elem
if col == set_size - 1:
row = row+1
col = (col + 1) % set_size
for a,b,c in SplitSets(items,3):
print a,b,c
答案 0 :(得分:4)
没什么可说明的,只有分区和模块用于查找行号和列号
items = [1,2,3,4,5,6,7,8,9]
def SplitSets(iterable,set_size):
#return a generator
return ((i/set_size, i%set_size,e) for i,e in enumerate(iterable))
for a,b,c in SplitSets(items,3):
print a,b,c
类似的代码是:
items = [1,2,3,4,5,6,7,8,9]
def SplitSets(iterable,set_size):
for i, elem in enumerate(iterable):
yield i/set_size, i%set_size, elem
for a,b,c in SplitSets(items,3):
print a,b,c
答案 1 :(得分:1)
一种解决方案是使用itertools:
from itertools import count, cycle, izip
def split_sets(iterable, set_size):
for a, b, c in izip(count(), cycle(range(set_size)), items):
yield a // set_size, b, c
items = [1, 2, 3, 4, 5, 6, 7, 8, 9]
set_size = 3
for a, b, c in split_sets(items, set_size):
print a, b, c
count()
,它返回 0,1,2,3,4 ...... 然后用set_size将a除以a整数得到我们想要的东西range(set_size)
为set_size为3返回 [0,1,2] 。cycle()
函数然后一遍又一遍地重复此序列。izip
(比Python 2.x的zip更有效)放在一起,我们就会得到我们想要的。