我已经找到了解决方案,但它实在是太慢了:如何分割成字典多个词典快
def chunks(self,data, SIZE=10000):
for i in xrange(0, len(data), SIZE):
yield dict(data.items()[i:i+SIZE])
你有没有使用外部模块(numpy的等)
我已经找到了解决方案,但它实在是太慢了:如何分割成字典多个词典快
def chunks(self,data, SIZE=10000):
for i in xrange(0, len(data), SIZE):
yield dict(data.items()[i:i+SIZE])
你有没有使用外部模块(numpy的等)
由于任何想法字典是如此之大,这将是更好地保持所有涉及到只是迭代器和发电机的项目,像这样
from itertools import islice
def chunks(data, SIZE=10000):
it = iter(data)
for i in xrange(0, len(data), SIZE):
yield {k:data[k] for k in islice(it, SIZE)}
采样运行:
for item in chunks({i:i for i in xrange(10)}, 3):
print item
输出
{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{8: 8, 6: 6, 7: 7}
{9: 9}
另一种方法是迭代压缩和解:
>>> from itertools import izip_longest, ifilter
>>> d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8}
创建字典迭代器的副本列表(拷贝数是在结果类型的字典的要素数)。通过将每个迭代器从chunks
列表传递到izip_longest
,您将从源代码字典中获得所需的元素数量(用于从zip结果中删除None
的ifilter
)。使用生成器表达式可以降低内存使用量:
>>> chunks = [d.iteritems()]*3
>>> g = (dict(ifilter(None, v)) for v in izip_longest(*chunks))
>>> list(g)
[{'a': 1, 'c': 3, 'b': 2},
{'e': 5, 'd': 4, 'g': 7},
{'h': 8, 'f': 6}]
不要继续调用'items'。每当你想要一个切片时,你都在制作一个新的物品清单。 – user2357112
是的,我知道,但问题是,我找不到一种不同的方法将我的字典拆分成相同大小的块。 – badc0re
尝试[itertools'的''grouper'配方](https://docs.python.org/2.7/library/itertools.html#recipes)。 – jonrsharpe