1

pythonic2つのリストのすべての製品の組み合わせを計算する方法は何ですか。したがって、2つの長さのリストがある場合、製品を含むn長さのリストを返したいと思い2^nます。

同様list(itertools.product(on,off))に、結果は次のような組み合わせペアだけでなく、4つの要素すべてを使用する必要があります。

[(1.05, 5.53), (1.05, 3.12), (1.05, 3.75), (1.05, 4.75), (1.5, 5.53), (1.5, 3.12), (1.5, 3.75), (1.5, 4.75), (2.1, 5.53), (2.1, 3.12), (2.1, 3.75), (2.1, 4.75), (1.7, 5.53), (1.7, 3.12), (1.7, 3.75), (1.7, 4.75)]

だからもっとこのように:

off = [5.53,3.12,3.75,4.75]
on = [1.05,1.5,2.1,1.7]

# calculate combinations
x = combinations(on,off)

# Where... 
# x[0] = off[0] * off[1] * off[2] * off[3] i.e
# x[0] = 5.53 * 3.12 * 3.75 * 4.75
#
# x[1] = off[0] * off[1] * off[2] * on[3] i.e
# x[1] = 5.53 * 3.12 * 3.75 * 1.7
#
# x[2] = off[0] * off[1] * on[2] * on[3] i.e
# x[2] = 5.53 * 3.12 * 2.1 * 1.7
#
# ...
#
# x[15] = on[0] * on[1] * on[2] * on[3] i.e
# x[15] = 1.05 * 1.5 * 2.1 * 1.7

itertools.product()出力はメソッドに似ている可能性があります。つまり [(5.53, 3.12, 3.75, 4.75),(5.53, 3.12, 3.75, 1.7), ...] 、積を計算する必要がありますが、組み合わせメソッドに興味があります。

注:これを行う方法を言うとき、私はpythonspythonic構造、ライブラリ(itertools ect)を利用する単純な1行または2行を意味します。

4

3 に答える 3

5

あなたはとても近かった、itertools.combinations()

于 2012-11-05T13:19:27.520 に答える
2

2**4から始めることで、すべての可能性を生み出すことができますitertools.product([0, 1], 4)0これは、長さ4のsとsのすべての可能なシーケンスを列挙します。次に、0-1シーケンスのi番目の要素がであるかどうかを取得することにより1、各0-1シーケンスをとからの値のシーケンスに変換できoffます。コード内:onoff[i]0on[i]

>>> import itertools
>>> off = [5.53,3.12,3.75,4.75]
>>> on = [1.05,1.5,2.1,1.7]
>>> for choices in itertools.product([0, 1], repeat=len(off)):
...     print [(on[i] if choice else off[i]) for i, choice in enumerate(choices)]
... 
[5.53, 3.12, 3.75, 4.75]
[5.53, 3.12, 3.75, 1.7]
[5.53, 3.12, 2.1, 4.75]
[5.53, 3.12, 2.1, 1.7]
... <10 more entries omitted ...>
[1.05, 1.5, 2.1, 4.75]
[1.05, 1.5, 2.1, 1.7]

リストの代わりに製品を印刷するには:

>>> import operator
>>> for choices in itertools.product([0, 1], repeat=len(off)):
...     elts = [(on[i] if choice else off[i]) for i, choice in enumerate(choices)]
...     print reduce(operator.mul, elts, 1)
... 
307.32975
109.9917
172.10466
61.595352
...

numpyを利用でき、Pythonリストの代わりにnumpy配列を使用する場合は、numpy.chooseのような優れたツールが利用できます。例えば:

>>> import numpy
>>> numpy.choose([0, 1, 0, 1], [off, on])
array([ 5.53,  1.5 ,  3.75,  1.7 ])
>>> numpy.product(numpy.choose([0, 1, 0, 1], [off, on]))
52.880624999999995

以前のソリューションと組み合わせると、次のようになります。

>>> for c in itertools.product([0, 1], repeat=4):
...     print numpy.product(numpy.choose(c, [off, on]))
... 
307.32975
109.9917
172.10466
61.595352
147.7546875
52.880625
...
于 2012-11-05T13:36:40.783 に答える
0

これは、あなたの望むことですか:

off = [5.53,3.12,3.75,4.75]
on = [1.05,1.5,2.1,1.7]
import itertools as it
import operator

indices = list(it.product([0,1],[0,1],[0,1],[0,1]))
off_on = off,on
a = [reduce(operator.mul,(off_on[z][i] for i,z in enumerate(x))) for x in indices]
print a


#Numpy solution
import numpy as np
indices = list(it.product([0,1],[0,1],[0,1],[0,1]))
off_on = off,on
b = np.array([off,on])
loff = range(len(off))
aa = [np.prod(b[list(x),loff]) for x in indices]

print aa
print aa == a
于 2012-11-05T13:24:32.240 に答える