我在哪里可以找到itertools.combinations()函数的源代码

Dha*_*aya 18 python python-3.x

我正试图找到一种编写组合函数的方法.我在哪里可以找到它?

Sve*_*ach 29

实际的源代码是用C语言编写的,可以在文件中找到itertoolsmodule.c.


eum*_*iro 17

请参阅itertools.combinations的文档.这个函数有一个等价的代码:

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
Run Code Online (Sandbox Code Playgroud)

  • @JasonS,有几点:首先,从示例中注意到,该算法生成的元组的“索引”始终已排序(特别是“索引[i] <索引[i + 1]”,不允许重复)和右侧-大多数尺寸更新最快。为了获取下一个元组,“i”上的 for 循环会找到“indices”中可以递增的最右边的位置。如果没有找到这样的“i”(因此不会发生“break”),则触发 for 循环的“else”子句,我们就完成了。否则,“index[i]”会递增,并且“j”上的循环将重置后面的索引以从新的“index[i]”开始计数。 (2认同)