python和combinatorics中的列表推导

时间:2014-04-05 03:18:04

标签: python list

假设有n个通道,每个通道都有一个数字值,比如第i个通道的值为f(i)。 我正在考虑使用python列表理解来计算这些通道中w(1< = w< = n)连续和不同产品的平均值。

例如,n = 3,

If w = 1 , return [f(1)+f(2)+f(3)]/3
If w = 2 , return [f(1)f(2)+f(1)f(3)+f(2)f(3)] /3 
If w = 3 , return [f(1)f(2)f(3)]/1 

这些指数可以通过以下方式实现:

[[i,j,k] for i in xrange(2) for j in xrange(2) for k in xrange(2) if i+j+k ==w]

然而,这些代码显然不能推广到任何n。 在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

N非常大时,这是列表推导的一个不好的示例,因为当每个变量开启或关闭时,您需要N变量for i in xrange(2),但它相当简单与itertools.combination

有关

例如,要克隆您的N=3示例:

results = []
for w in range(1,4):
    results += [[i,j,k] for i in xrange(2) for j in xrange(2) for k in xrange(2) if i+j+k ==w]

您获得的结果为:[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

现在使用itertools.combination以下内容可以扩展到更大的N.

import itertools
results = []
N=3
for w in range(1,N+1):
    results += list(itertools.combinations(range(N),w))

您获得[(0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]的结果,即返回非零变量的索引。

这可以简单地转换为另一种形式,例如:

for index_tuple in results:
    new = [0]*N
    for i in index_tuple:
        new[i] = 1
    new_results.append(new)

其中new_results具有相同的格式[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]],并且可以简单地扩展为更大的N.(当然,最好将它保留为第一种形式,或使用numpy之类的东西来有效地使用屏蔽阵列)。

答案 1 :(得分:0)

我会保持这个简短的说明:

Python 2

>>> import itertools
>>> from operator import mul
>>> from __future__ import division
>>> def calc(f, w):
        if w >= 1 and w <= len(f):
            l = [reduce(mul, comb) for comb in itertools.combinations(f, w)]
            return round(sum(l)/len(l), 3)

>>> calc([1,2,3], 2)
3.667
>>> calc([2,2,2,1], 2)
3.0

Python 3

>>> import itertools
>>> from operator import mul
>>> from functools import reduce
>>> def calc(f, w):
        if w >= 1 and w <= len(f):
            l = [reduce(mul, comb) for comb in itertools.combinations(f, w)]
            return round(sum(l)/len(l), 3)

>>> calc([1,2,3], 2)
3.667
>>> calc([2,2,2,1], 2)
3.0

有关乘法部分的解释,请参阅What's the Python function like sum() but for multiplication? product()?