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

Python 如何在一组N-deep对象中创建列表或每个排列,python,list,python-2.7,Python,List,Python 2.7,我有一个动作对象的元组 我想创建一个列表,列出N deep中所有可能的动作对象排列 i、 e.如果我有吃、睡、喝的动作,N=2 名单将是 [[Eat, Eat], [Eat, Sleep], [Eat, Drink], [Sleep, Eat], [Sleep, Sleep], [Sleep, Drink], [Drink, Eat], [Drink, Sleep], [Drink, Drink]] 现在,我有一个比三个动作大得多的列表,N可能是3个或更多 在Python2.7

我有一个动作对象的元组

我想创建一个列表,列出N deep中所有可能的动作对象排列

i、 e.如果我有吃、睡、喝的动作,N=2

名单将是

[[Eat, Eat],
 [Eat, Sleep],
 [Eat, Drink],
 [Sleep, Eat],
 [Sleep, Sleep],
 [Sleep, Drink],
 [Drink, Eat],
 [Drink, Sleep],
 [Drink, Drink]]
现在,我有一个比三个动作大得多的列表,N可能是3个或更多

在Python2.7中如何实现这一点?

听起来像是希望列表本身的样式。使用:

可选的
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)
听起来好像你想要一个列表本身。使用:

可选的
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)

非常感谢。这太完美了。现在就试试,谢谢!这太完美了。现在就尝试一下。使用
mylist=[i for i in itertools.product(…)]
可以达到同样的效果。无需在列表中调用
list.append()
!另外,这适用于小列表和小
N
,但对于大列表和大
N
,这将尝试同时实现整个列表。由于完整列表无法放入内存,因此会使Python崩溃。(见我上面的答案。)使用
mylist=[i for i in itertools.product(…)]
可以达到相同的效果。无需在列表中调用
list.append()
!另外,这适用于小列表和小
N
,但对于大列表和大
N
,这将尝试同时实现整个列表。由于完整列表无法放入内存,因此会使Python崩溃。(见上文我的答案。)
>>> import itertools
>>> actions='eat','sleep','drink'
>>> mylist=[]
>>> [mylist.append(list(i)) for i in list(itertools.product(actions,repeat=2))]
[None,None, None, None, None, None, None, None, None]
>>> mylist
[['eat', 'eat'], ['eat', 'sleep'], ['eat', 'drink'], ['sleep', 'eat'], ['sleep', 'sleep'],   ['sleep', 'drink'], ['drink', 'eat'], ['drink', 'sleep'], ['drink', 'drink']]