Python 输出不按字典顺序排列的笛卡尔积

Python 输出不按字典顺序排列的笛卡尔积,python,Python,我想在Python中的几个可重用项之间做一个笛卡尔乘积,并指定迭代的顺序 例如,在我的示例中,我有3个iterable:'AB',xy',01'。当我写作时 import itertools print list(itertools.product('AB', 'xy', '01')) 输出为: 我希望能够指定首先迭代iterable 1('AB'),然后迭代iterable 3('01'),然后迭代iterable 2('xy'),这将提供以下输出: ('A', 'x', '0') ('B

我想在Python中的几个可重用项之间做一个笛卡尔乘积,并指定迭代的顺序

例如,在我的示例中,我有3个iterable:
'AB',xy',01'
。当我写作时

import itertools
print list(itertools.product('AB', 'xy', '01')) 
输出为:

我希望能够指定首先迭代iterable 1(
'AB'
),然后迭代iterable 3(
'01'
),然后迭代iterable 2(
'xy'
),这将提供以下输出:

('A', 'x', '0')
('B', 'x', '0')
('A', 'x', '1')
('B', 'x', '1')
('A', 'y', '0')
('B', 'y', '0')
('A', 'y', '1')
('B', 'y', '1')

在Python中有没有标准的方法?我可以使用Numpy。

只需按照您希望迭代的顺序传递iterables(或者更确切地说,用您的术语来说,是相反的顺序——传递的第一个迭代将是最外层的迭代,因此它将循环“最慢”)。如果必须使用不同顺序的结果元组,只需在之后交换结果:

>>> [(c, a, b) for a, b, c in itertools.product('xy', '01', 'AB')]
[(u'A', u'x', u'0'),
 (u'B', u'x', u'0'),
 (u'A', u'x', u'1'),
 (u'B', u'x', u'1'),
 (u'A', u'y', u'0'),
 (u'B', u'y', u'0'),
 (u'A', u'y', u'1'),
 (u'B', u'y', u'1')]

请注意,这不需要对结果进行任何额外的传递:每个元组在生成时都会进行交换。

为什么不按照您希望迭代的顺序传递这些元组?@BrenBarn每个元组的元素都必须以某种方式进行排序。我想我可以在调用itertools.product后重新组织它们,但这听起来像是不必要的第二步。谢谢,我没想到交换会这么容易!
>>> [(c, a, b) for a, b, c in itertools.product('xy', '01', 'AB')]
[(u'A', u'x', u'0'),
 (u'B', u'x', u'0'),
 (u'A', u'x', u'1'),
 (u'B', u'x', u'1'),
 (u'A', u'y', u'0'),
 (u'B', u'y', u'0'),
 (u'A', u'y', u'1'),
 (u'B', u'y', u'1')]