0

バイトのリストがあるとします(x00 to xFF)。itertoolsを使用して、長さがXの順列のみを返すにはどうすればよいですか。たとえば、長さが3のすべての順列が必要な場合は、次のようになります。

[x00,x00,x00], [x00,x00,x01], ..., [xFF,xFF,xFF]

そうすれば、コンピューティングリソースの無駄がなくなります。

編集:より良い方法があれば、itertoolsである必要はありません。

4

3 に答える 3

3
import itertools
for tup in itertools.product(range(0x100), repeat=3):
    ...
于 2013-02-16T22:50:25.317 に答える
1

itertools.combinations_with_replacement:

>>> my_list = [1, 2, 3, 4]
>>> import itertools
>>> 
>>> list(itertools.combinations_with_replacement(my_list, 3))
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), 
 (1, 2, 2), (1, 2, 3), (1, 2, 4), 
 (1, 3, 3), (1, 3, 4), 
 (1, 4, 4), 
 (2, 2, 2), (2, 2, 3), (2, 2, 4), 
 (2, 3, 3), (2, 3, 4), 
 (2, 4, 4), 
 (3, 3, 3), (3, 3, 4), 
 (3, 4, 4), 
 (4, 4, 4)]

すべての順列を交換して欲しいようです。その場合、itertools.product@gnibblerの回答のように必要です。

于 2013-02-16T22:48:14.390 に答える
1

@gnibblerのソリューションの方が正しいようですか?

In [162]: >>> l = [1, 2, 3]

In [163]: list(itertools.combinations_with_replacement(l, 3))
Out[163]:
[(1, 1, 1),
 (1, 1, 2),
 (1, 1, 3),
 (1, 2, 2),
 (1, 2, 3),
 (1, 3, 3),
 (2, 2, 2),
 (2, 2, 3),
 (2, 3, 3),
 (3, 3, 3)]

In [164]: list(itertools.product(l, repeat=3))
Out[164]:
[(1, 1, 1),
 (1, 1, 2),
 (1, 1, 3),
 (1, 2, 1),
 (1, 2, 2),
 (1, 2, 3),
 (1, 3, 1),
 (1, 3, 2),
 (1, 3, 3),
 (2, 1, 1),
 (2, 1, 2),
 (2, 1, 3),
 (2, 2, 1),
 (2, 2, 2),
 (2, 2, 3),
 (2, 3, 1),
 (2, 3, 2),
 (2, 3, 3),
 (3, 1, 1),
 (3, 1, 2),
 (3, 1, 3),
 (3, 2, 1),
 (3, 2, 2),
 (3, 2, 3),
 (3, 3, 1),
 (3, 3, 2),
 (3, 3, 3)]
于 2013-02-16T22:58:03.270 に答える