Python优化分组器函数以避免None元素

2024-09-30 10:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我正在使用python的itertools中的Grouper函数来削减大量selectwherein(idlist)查询,以获得sqlite性能。问题是grouper会填满chunksize的整个空间,即使这个列表要小得多,所以我不得不在这之前添加一个循环和比较,现在我想优化一下。在

# input list shorter than grouper chunk size
input = (1,2,3,4,5)

grouper(10,input)
# desired output = (1,2,3,4,5)
# actual output = (1,2,3,4,5,None,None,None,None,None)

# current fix for this issue
list_chunks = tuple(tuple(n for n in t if n) for t in grouper(10, input))

我认为必须有一种方法来做到这一点,而不是这个循环和比较。在

注意:使用Python2.5


Tags: 函数innoneforinputoutputsqlite性能
3条回答

像这样?在

>>> filter(bool, (1,2,3,4,5,None,None,None,None,None))
(1, 2, 3, 4, 5)

对于更复杂的情况(例如,列表中有0或者您需要删除与None不同的内容),您可以实现自己的lambda

^{pr2}$

甚至是

>>> from functools import partial
>>> from operator import ne
>>> filter(partial(ne, None), (0,1,2,3,4,5,None,None,None,None,None))
(0, 1, 2, 3, 4, 5)

如果不是筛选出None项,而是重写grouper()以返回所需的是一个选项,则可以使用以下解决方案使用itertools.islice

def grouper(n, iterable):
    it = iter(iterable)
    x = tuple(islice(it, n))
    while x:
        yield x
        x = tuple(islice(it, n))

或一个较短的等效物(稍难理解):

^{pr2}$

示例:

>>> list(grouper(5, range(12)))
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9), (10, 11)]

您可以使用filtermap

map(lambda x: filter(bool, x), grouper(10, my_input))

下面是一个例子:

^{pr2}$

最后,如果希望它是一个元组而不是一个列表,则可以将其包装在tuple()调用中。在

相关问题 更多 >

    热门问题