你能把一个集合分成相等的部分吗?
Can you split a set into equal parts?
我想做如下事情:
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)
您可以将集合转换为列表,进行切片,然后再将其转换回集合:
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])
您可以使用 itertools.islice
,但集合不能保证顺序,所以如果您不查看整个集合,请小心
集合无法像列表一样进行索引,但您可以迭代 "chunks" 或它们的子组。使用来自 itertools
的 grouper
食谱:
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)
集合初始值设定项的初始顺序未保留,因为与列表不同,
集合不保留顺序。
使用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)
我想做如下事情:
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)
您可以将集合转换为列表,进行切片,然后再将其转换回集合:
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])
您可以使用 itertools.islice
,但集合不能保证顺序,所以如果您不查看整个集合,请小心
集合无法像列表一样进行索引,但您可以迭代 "chunks" 或它们的子组。使用来自 itertools
的 grouper
食谱:
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)
集合初始值设定项的初始顺序未保留,因为与列表不同, 集合不保留顺序。
使用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)