Python 如何在一组N-deep对象中创建列表或每个排列
我有一个动作对象的元组 我想创建一个列表,列出N deep中所有可能的动作对象排列 i、 e.如果我有吃、睡、喝的动作,N=2 名单将是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
[[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']]