【问题标题】:Python: Split list in to setsPython:将列表拆分为集合
【发布时间】:2015-07-10 03:22:26
【问题描述】:

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

【问题讨论】:

  • 你能告诉我们你想要什么输出吗?你的问题目前还不清楚。
  • 你没有产生 set 对象,这是大多数 Python 开发人员希望你在使用该术语时所指的内容。您是否正在尝试将您的列表分组?
  • Martijn,代表我对术语的正确使用不当。我正在尝试对最大大小为指定数字的组中的项目列表进行排序。用例是我想要一个按钮列表,这些按钮将被排序为 x 行,每行有最大数量
  • 听起来您只需要 itertools 文档中的 grouper 配方。在这种情况下......只需复制该配方,或安装more_itertools 并从那里导入它。如果这就是你想要的,那么它几乎肯定是一个重复,除非你认为枚举外部和内部迭代是困难的部分。

标签: python set iterable enumerate


【解决方案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... 然后我们将 a 与 set_size 进行整数除以得到什么我们想要
  • 对于第二列,range(set_size) 在 set_size 为 3 时返回 [0, 1, 2]cycle() 函数然后一遍又一遍地重复此序列。
  • 最后一列无需解释
  • 现在,如果我们将这些列和izip(在 Python 2.x 中比 zip 更有效)结合起来,我们将得到我们想要的。

【讨论】:

    【解决方案2】:

    不多解释,只用除法和模来求行列号

    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
    

    【讨论】:

    • 可能把 3 改成 set_size
    • OP 的代码创建了一个生成器。也许你也应该把它改成return ((i/...ble))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2012-03-10
    • 2018-08-25
    • 1970-01-01
    • 2015-07-26
    • 2020-02-10
    相关资源
    最近更新 更多