如何在一组N-deep对象中创建列表或每个排列

Vik*_*ran 1 python list python-2.7

我有一个Action对象元组

我想创建一个列表,列出Action对象N深度的每个可能的排列.

即如果我有吃,睡,喝,N = 2的行动

列表将是

[[Eat, Eat],
 [Eat, Sleep],
 [Eat, Drink],
 [Sleep, Eat],
 [Sleep, Sleep],
 [Sleep, Drink],
 [Drink, Eat],
 [Drink, Sleep],
 [Drink, Drink]]
Run Code Online (Sandbox Code Playgroud)

现在,我有一个比三个动作更大的列表,N可能是3或更多.

我将如何在Python 2.7中执行此操作?

Li-*_*Yip 5

听起来你想要一个列表的笛卡尔积.用途itertools.product():

>>> import itertools, pprint
>>> mylist = ["Eat","Sleep","Drink"]
>>> my_combination = list(itertools.product(mylist, repeat = 2))
>>> pprint.pprint (my_combination)
[('Eat', 'Eat'),
 ('Eat', 'Sleep'),
 ('Eat', 'Drink'),
 ('Sleep', 'Eat'),
 ('Sleep', 'Sleep'),
 ('Sleep', 'Drink'),
 ('Drink', 'Eat'),
 ('Drink', 'Sleep'),
 ('Drink', 'Drink')]
Run Code Online (Sandbox Code Playgroud)

可选repeat参数控制列表的"深度".

请注意,列表的大小随深度呈指数级增长N.不要一次实现整个列表 - 而是一次使用一个元素.

# Don't do this - will crash Python with out-of-memory error
list(itertools.product(my_list, repeat = 100000))

# Iterate over the list instead
for one_combination in itertools.product(my_list, repeat = 100000):
    print (one_combination)
Run Code Online (Sandbox Code Playgroud)