我想做以下事情:
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)
答案 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)