我有一个 Action 对象的元组
我想创建一个包含 N 深 Action 对象的所有可能排列的列表。
即如果我有 Eat、Sleep、Drink 和 N = 2 等 Action
列表是
[[Eat, Eat],
[Eat, Sleep],
[Eat, Drink],
[Sleep, Eat],
[Sleep, Sleep],
[Sleep, Drink],
[Drink, Eat],
[Drink, Sleep],
[Drink, Drink]]
现在,我的列表比三个 Action 大得多,N 可能是 3 个或更多。
我如何在 Python 2.7 中执行此操作?
请您参考如下方法:
听起来你想要 Cartesian product自己的列表。使用 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')]
可选的 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)
