1

Action オブジェクトのタプルがあります

アクション オブジェクト N の深さのすべての可能な順列のリストを作成したいと考えています。

つまり、食べる、寝る、飲む、N = 2 のアクションがある場合

リストは

[[Eat, Eat],
 [Eat, Sleep],
 [Eat, Drink],
 [Sleep, Eat],
 [Sleep, Sleep],
 [Sleep, Drink],
 [Drink, Eat],
 [Drink, Sleep],
 [Drink, Drink]]

現在、3 つのアクションよりもはるかに大きなリストがあり、N はおそらく 3 つ以上になるでしょう。

Python 2.7でこれを行うにはどうすればよいですか?

4

2 に答える 2

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')]

オプションのrepeat引数は、リストの「深さ」を制御します。

リストのサイズは、深さとともに指数関数的に増加することに注意してくださいN。一度にリスト全体を具体化しないでください。代わりに、一度に 1 つの要素を使用してください。

# 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)
于 2012-05-17T05:29:19.167 に答える
1
>>> 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']]
于 2012-05-17T05:59:24.083 に答える