你能把一组分成相等的部分吗?

时间:2015-03-27 04:22:17

标签: python set slice

我想做以下事情:

s = set()
s.add('a')
s.add('q')
s.add('x')
s.add('banana')

s1 = s(:1)
s2 = s(2:3)

以上是对套装的有效操作吗?有没有办法将上述内容应用于生成器,例如:

def Chunks(container, size):
    for i in xrange(0, len(container), size):
        yield container(i:i+size)

4 个答案:

答案 0 :(得分:2)

您可以将集转换为列表,执行切片,然后将其转换回集:

In [13]: s = {1,2,3}

In [14]: s_l = list(s)

In [15]: print set(s_l[:1]), set(s_l[1:])
set([1]) set([2, 3])

请注意,集合不支持排序,因此任何此类排序操作都必须在列表中完成:

In [16]: s = {1,2,3,0}

In [17]: s
Out[17]: {0, 1, 2, 3}

In [18]: s_l = list(s)

In [19]: print set(s_l[:2]), set(s_l[2:])
set([0, 1]) set([2, 3])

答案 1 :(得分:2)

你可以使用itertools.islice,通过套装来保证订购,所以如果你不是在看整套,请小心

答案 2 :(得分:2)

集合不像列表那样可索引,但你可以迭代"块"或来自他们的子组。使用grouper中的itertools食谱:

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

s2 = set('Andy Sandy Jack Jill Frank Fred Sally Sarah Bill Billy Bob'.split())

for g in grouper(s2, 3):
    print g

收率:

('Sarah', 'Frank', 'Bill')
('Fred', 'Billy', 'Jill')
('Andy', 'Jack', 'Bob')
('Sally', 'Sandy', None)

设置初始化程序的初始顺序不会保留,因为与列表不同, 不要保留秩序。

答案 3 :(得分:2)

使用itertools.islice很容易

>>> from itertools import islice
>>> def chunk(it, size):
...    it = iter(it)
...    return iter(lambda: tuple(islice(it, size)), ())

>>> data = {i for i in range(20)}

for j in chunk({i for i in range(20)}, 4):
...     print(j)
... 
(0, 1, 2, 3)
(4, 5, 6, 7)
(8, 9, 10, 11)
(12, 13, 14, 15)
(16, 17, 18, 19)