Python:将列表拆分为集合

时间:2015-04-30 12:12:32

标签: python set iterable enumerate

我正在尝试将列表拆分为枚举集,并且我有一个实现似乎做我想要的但是它感觉不是很“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

2 个答案:

答案 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

讨论

  • 对于第一列(a),我们调用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更有效)放在一起,我们就会得到我们想要的。