Python2.7序列中所有可能的值对(2项元组)组合

2024-10-04 01:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数学头脑放屁的时刻,谷歌没能回答我的窘境。在

给定一个包含两个项目元组的序列或列表(来自Counter对象),我如何快速优雅地让python输出这些元组的所有可能组合的线性序列或数组?我的目标是从一个计数器对象中找到结果的组合。。。。。在

例如,如果我有以下顺序:

[(500, 2), (250, 1)]  

手动执行此示例时,应产生以下结果:

^{pr2}$

基本上,我认为它是a*b的范围,然后把结果列表加在一起。。。 我试过这个(其中c=Counter object):

res = [[k*(j+1) for j in range(c[k])] for k in c]

它会还给我:

res = [[250], [500, 1000]]

到目前为止很好,它通过每个元组,并将x*y乘以每个y。。。但是结果列表还没有包含所有的组合,第一个列表[250]需要添加到第二个列表的每个元素中。我相信任何一个结果都是如此。在

现在我想我需要将这个结果列表中的每个列表依次添加到其他列表中的其他元素中。我做错了吗?我发誓应该有更简单的方法。我觉得应该有一种方法在一行列表比较中做到这一点。在

解决方案是递归的吗?有没有我不知道的神奇的导入或内置方法?我的头好痛。。。。。。在


Tags: 项目对象方法in元素列表forcounter
2条回答

我不太确定我是否了解你,但也许你在寻找类似的东西

from itertools import product

def lincombs(s):
    terms, ffs = zip(*s)
    factors = product(*(range(f+1) for f in ffs))
    outs = (sum(v*f for v,f in zip(terms, ff)) for ff in factors if any(ff))
    return outs

这给了

^{pr2}$

可以避免@DSM's answerv*f乘法:

>>> from itertools import product
>>> terms = [(500, 2), (250, 1)]
>>> map(sum, product(*[xrange(0, v*a+1, v) for v, a in terms]))
[0, 250, 500, 750, 1000, 1250]

要获得没有重复项的已排序输出:

^{pr2}$

不过,在本例中,您使用的sorted(set(it))是可以的。在

相关问题 更多 >