📜  不使用 itertools 的Python组合

📅  最后修改于: 2022-05-13 01:54:45.399000             🧑  作者: Mango

不使用 itertools 的Python组合

Python中的 Itertools 是一个在迭代器上工作的方法的帮助下生成复杂迭代器的模块。该模块可作为一种快速、高效的内存工具,可单独使用或组合使用以形成迭代器代数。

使用 itertools 打印组合

使用 Itertools,我们可以以一种非常优化的方式显示字符串的所有可能组合。要显示组合,它需要 2 个参数。首先是字符串,其次是所需子字符串的长度。以下示例使用 itertools 为字符串'abc' 进行所有组合。
例子:

Python3
# Import combinations from itertools
from itertools import combinations
   
     
def n_length_combo(arr, n):
     
    # using set to deal
    # with duplicates 
    return list(combinations(arr, n))
   
# Driver Function
if __name__ == "__main__":
    arr = 'abc'
    n = 2
    print (n_length_combo([x for x in arr], n) )


Python3
# Function to create combinations
# without itertools
def n_length_combo(lst, n):
     
    if n == 0:
        return [[]]
     
    l =[]
    for i in range(0, len(lst)):
         
        m = lst[i]
        remLst = lst[i + 1:]
         
        for p in n_length_combo(remLst, n-1):
            l.append([m]+p)
             
    return l
 
# Driver code
if __name__=="__main__":
    arr ="abc"
    print(n_length_combo([x for x in arr], 2))


Python3
import numpy
 
 
def n_length_combo(iterable, r):
     
    char = tuple(iterable)
    n = len(char)
     
    if r > n:
        return
     
    index = numpy.arange(r)
     
    # returns the first sequence
    yield tuple(char[i] for i in index)
     
    while True:
         
        for i in reversed(range(r)):
            if index[i] != i + n - r:
                break
        else:
            return
         
        index[i] += 1
         
        for j in range(i + 1, r):
             
            index[j] = index[j-1] + 1
             
        yield tuple(char[i] for i in index)
         
# Driver code
print([x for x in n_length_combo("abc", 2)])


输出

[('a', 'b'), ('a', 'c'), ('b', 'c')]

不使用 itertools 打印组合

  • 通过使用递归。
    要在不使用 itertools 的情况下创建组合,请逐个迭代列表并修复列表的第一个元素并与剩余的列表进行组合。类似地,通过剩余列表的递归逐一迭代所有列表元素。

Python3

# Function to create combinations
# without itertools
def n_length_combo(lst, n):
     
    if n == 0:
        return [[]]
     
    l =[]
    for i in range(0, len(lst)):
         
        m = lst[i]
        remLst = lst[i + 1:]
         
        for p in n_length_combo(remLst, n-1):
            l.append([m]+p)
             
    return l
 
# Driver code
if __name__=="__main__":
    arr ="abc"
    print(n_length_combo([x for x in arr], 2))
  • 输出
[('a', 'b'), ('a', 'c'), ('b', 'c')]
  • 通过使用迭代
    在此,按原样返回字符串中 n 个元素的第一个组合,然后通过按每个元素的位置来考虑其他组合。每个元素根据其位置而不是其值被视为唯一的。因此,如果输入元素是唯一的,则每个组合中都不会出现重复值。

Python3

import numpy
 
 
def n_length_combo(iterable, r):
     
    char = tuple(iterable)
    n = len(char)
     
    if r > n:
        return
     
    index = numpy.arange(r)
     
    # returns the first sequence
    yield tuple(char[i] for i in index)
     
    while True:
         
        for i in reversed(range(r)):
            if index[i] != i + n - r:
                break
        else:
            return
         
        index[i] += 1
         
        for j in range(i + 1, r):
             
            index[j] = index[j-1] + 1
             
        yield tuple(char[i] for i in index)
         
# Driver code
print([x for x in n_length_combo("abc", 2)])
  • 输出
[('a', 'b'), ('a', 'c'), ('b', 'c')]