Python:将列表拆分为多个集合

Python:将列表拆分为多个集合,python,set,iterable,enumerate,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

我正在尝试将一个列表拆分为枚举集,我有一个实现,它似乎可以实现我想要的功能,但感觉不是很“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
预期产量为

1,2,3
4,5,6
7,8,9

没有太多的解释,只有division和module用于查找行和列的编号

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

一种解决方案是使用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。。。然后,我们用设置的大小除以a,得到我们想要的结果
  • 对于第二列,
    range(set\u size)
    为set\u size 3返回[0,1,2]。然后使用
    cycle()
    函数反复重复此序列
  • 最后一列不需要解释
  • 现在,如果我们将这些列和
    izip
    (这比Python2.x的zip更有效)放在一起,我们将得到我们想要的

您能告诉我们您想要什么样的产量吗?您的问题目前还不清楚,您并没有生成
set
对象,这是大多数Python开发人员在使用该术语时所期望的。你是想把你的列表分成几块吗?Martijn,正确的,代表我使用的术语很糟糕。我正在尝试按组对项目列表进行排序,最大大小为指定的数字。用例是,我希望有一个按钮列表,这些按钮将按x行数排序,每行的最大数量。听起来您只需要
itertools
文档中的
grouper
配方。在这种情况下。。。只需复制该配方,或安装
更多itertools
并从那里导入即可。如果这是你想要的,它几乎肯定是一个dup,除非你认为枚举外部和内部可重用项是困难的部分。可能更改3以设置_sizeOP的代码创建一个生成器。也许您还应该将其更改为
return((i/…ble))