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中执行此操作?
听起来你想要一个列表的笛卡尔积.用途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)