将 itertools.product 应用于列表列表元素的Python程序
Itertools 是一个模块,由在Python中的可迭代组件上应用各种基于迭代的操作(包括组合、排列等)的方法组成。它有一套用于执行迭代器代数的轻量级、内存效率高和快速的工具。
注意:更多信息请参考Python Itertools
itertools.product()
它用于在列表中或列表之间执行笛卡尔积。嵌套循环以最右边的元素在每次迭代中前进的方式循环。这种模式创建了一个字典顺序,因此如果输入的迭代是排序的,那么产品元组也是排序的。
它将迭代作为参数。下面的示例显示了itertools.product()
方法的一个非常简单的表示。在这里,它被用作笛卡尔积的创建。
例子:
import itertools
def product(str1, str2):
# returning the list containing
# cartesian product
return [x for x in itertools.product(list(str1),
list(str2))]
print(product("GfG", "GFG"))
输出:
[(‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’), (‘f’, ‘G’), (‘f’, ‘F’), (‘f’, ‘G’), (‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’)]
对列表列表进行操作
要在列表列表上使用itertools.product()
方法,请先执行解包操作。可以使用两种方式完成:
- 通过解包函数内部的列表
下面的例子展示了如何通过方法内的简单操作进行解包。
import itertools def product(list_of_str): str1 = list_of_str[0] str2 = list_of_str[1] # returning the list # containing cartesian product return [x for x in itertools.product(list(str1), list(str2))] print(product(["GfG", "GFG"]))
输出
[(‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’), (‘f’, ‘G’), (‘f’, ‘F’), (‘f’, ‘G’), (‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’)]
这种方式的缺点是,它需要知道额外的信息,即列表中列表的长度。
- 使用“*”运算符
为了克服上述缺点,'*' 用于解包列表中的列表。所以上面的代码可以优化如下:
import itertools def product(lst): # Unpack operation performed # by '*' operator and returning # the list containing cartesian # product return [x for x in itertools.product(*lst)] # list of lists being passed in the method print(product(["GfG", "GFG"]))
输出
[(‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’), (‘f’, ‘G’), (‘f’, ‘F’), (‘f’, ‘G’), (‘G’, ‘G’), (‘G’, ‘F’), (‘G’, ‘G’)]