python2.5.2中的置换

2024-10-02 16:33:57 发布

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

我有一个数字列表供输入,例如

671.00   
1,636.00
436.00
9,224.00

我想生成所有可能的和,并用一种方法标识输出,例如:

^{pr2}$

我想用Python来做 我目前的限制是: a) 我现在正在学习python(这是想法的一部分) b) 我将不得不使用python2.5.2(没有intertools)

我想我找到了一段可能有帮助的代码:

def all_perms(str):
    if len(str) <=1:
        yield str
    else:
        for perm in all_perms(str[1:]):
            for i in range(len(perm)+1):
                #nb str[0:1] works in both string and list contexts
                yield perm[:i] + str[0:1] + perm[i:]

(来自these guys

但我不知道如何在我的求婚中使用它。 有人能告诉我一些提示和帮助代码吗?在

干杯

f


Tags: 方法代码in列表forlen数字all
3条回答

除了一个给定的“列表”之外,返回所有的子集合列表。在

def all_sums(l): #assumes that l is non-empty
    if len(l)==1:
        return ([[l[0]]])
    if len(l)==0:
        return []
    result = []
    for i in range(0,len(l)):
        result.append([l[i]])
        for p in all_sums(l[i+1:]):
            result.append([l[i]]+p)
    return result

现在您只需编写一个简短的函数doit来输出:

^{pr2}$

排列是指将一组有序的事物集合起来,并将这些事物移动(即改变顺序)。你的问题是关于你清单上的东西的组合。在

现在,枚举组合的一种简单方法是将列表中的条目映射到数字中的位。例如,假设如果位0被设置(即1),那么数字lst[0]参与组合,如果位1被设置,那么lst[1]参与组合,等等。这样,范围0 <= n < 2**(len(lst))中的数字标识{}成员的所有可能组合,包括空的(n = 0)和整个{}(n = 2**(len(lst)) - 1)的所有可能组合。在

您只需要2个或更多项的组合,即只需要那些在二进制表示中至少有两个非零位的组合id。以下是如何识别这些:

def HasAtLeastTwoBitsSet(x) :
    return (x & (x-1)) != 0

# Testing:
>>> [x for x in range(33) if HasAtLeastTwoBitsSet(x)]
[3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]

下一步是提取由组合id标识的列表成员的组合。由于列表理解的强大功能,这很容易做到:

^{pr2}$

现在让我们制作一个生成所有和及其字符串表示的生成器:

def IterAllSums(lst) :
    combinations = [i for i in range(1 << len(lst)) if HasAtLeastTwoBitsSet(i)]
    for comb in combinations :
        sublist = GetSublistByCombination(lst, comb)
        sum_str = '+'.join(map(str, sublist))
        sum_val = sum(sublist)
        yield (sum_str, sum_val)

最后,让我们使用它:

>>> for sum_str, sum_val in IterAllSums([1,2,3,4]) : print sum_str, sum_val

1+2 3
1+3 4
2+3 5
1+2+3 6
1+4 5
2+4 6
1+2+4 7
3+4 7
1+3+4 8
2+3+4 9
1+2+3+4 10

使用itertools(Python>;=2.6)将是:

from itertools import *
a=[1,2,3,4]
sumVal=[tuple(imap(sum,combinations(a,i))) for i in range(2,len(a)+1)]

相关问题 更多 >