如何修改Python中itertools.product的迭代顺序?
调整itertools.product的笛卡尔积遍历顺序
嘿,我懂你想要改变itertools.product默认遍历顺序的需求啦!默认情况下它是让最后一个输入的可迭代对象迭代最快——就像你举的例子那样,先固定第一个元素,把第二个元素的所有值都遍历完,再推进第一个元素。如果想要换一种遍历逻辑,这里有几种实用的方案:
1. 让第一个输入的可迭代对象先迭代(先推进第一个元素,再固定第二个)
如果你想反过来,先把第一个可迭代对象的所有元素都走一遍,再切换第二个元素的值,可以先反转输入的可迭代对象顺序,生成笛卡尔积后再把每个元组反转回来:
import itertools # 先反转输入的可迭代对象顺序,生成product后反转每个元组 result = [tuple(reversed(item)) for item in itertools.product(['b','c','a'], [2,1,0])] print(result) # 输出: [(2, 'b'), (1, 'b'), (0, 'b'), (2, 'c'), (1, 'c'), (0, 'c'), (2, 'a'), (1, 'a'), (0, 'a')]
2. 按元组的自然字典序遍历
如果想要得到按元组默认排序规则(字典序)排列的结果,直接对product的输出做排序就好:
import itertools original_product = list(itertools.product([2,1,0],['b','c','a'])) sorted_result = sorted(original_product) print(sorted_result) # 输出: [(0, 'a'), (0, 'b'), (0, 'c'), (1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')]
3. 自定义个性化排序规则
要是你有更特殊的排序需求(比如先按第二个元素的原始顺序排列,再按第一个元素的倒序排列),可以用sorted函数的key参数来指定规则:
import itertools original_product = list(itertools.product([2,1,0],['b','c','a'])) # 先按第二个元素在原列表中的位置排序,再按第一个元素的倒序排序 custom_sorted = sorted(original_product, key=lambda x: (['b','c','a'].index(x[1]), -x[0])) print(custom_sorted) # 输出: [(2, 'b'), (1, 'b'), (0, 'b'), (2, 'c'), (1, 'c'), (0, 'c'), (2, 'a'), (1, 'a'), (0, 'a')]
这样就能完全按照你的需求来调整笛卡尔积的遍历顺序啦~
内容的提问来源于stack exchange,提问作者BallpointBen
相关产品推荐
相关产品推荐

