有没有一种方法可以获取一组元组的组合?

时间:2018-07-18 19:10:55

标签: python combinations

我有一组元组:

foreach (var record in AllConditionsByCountry) // you can use AllConditionsByCountry.ForEach(record=>{...});
{
  ...
  //AllConditionsByCountry will not query db again, because it's a list, no long a query
  var rList = AllConditionsByCountry.Where(x => x.ConditionID == conditionID);//.Select(x => x).AsEnumerable(); //no necessary to use AsXXX if compilation do not require it.
  ...
}

我可以得到总和低于某个值的中间(或第一个或最后一个)值的组合:

(1, 3, 6)
(5, 2, 4)
...
(8, 1, 9)

但是我希望能够跟踪这些值来自哪个元组,因此,我不仅要返回带有适当总和的值集,还想返回这些值来自的整个元组。不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

怎么样

from itertools import combinations

def func(tuples, maxVal):
    return [seq for s in range(len(tuples), 0, -1)
                for seq in combinations(tuples, s)
                if sum(t[1] for t in seq) <= maxVal]

tuplesset = {(1, 3, 6), (5, 2, 4), (8, 1, 9)}
print(func(tuplesset, 4))

打印出来的是

[((1, 3, 6), (8, 1, 9)), ((5, 2, 4), (8, 1, 9)), ((1, 3, 6),), ((5, 2, 4),), ((8, 1, 9),)]

这似乎是正确的。

我的例程和您的例程之间的主要区别在于,我省略了values变量(元组中的中间值),并使用表达式sum(t[1] for t in seq)而不是sum(seq)来求和元组的中间值。为了清晰起见,我还将您的一条长线分成多条短线,以便更好地遵循PEP8。

答案 1 :(得分:0)

如果您确实要保存元组而不是仅保存索引,则可以使用映射为对的字典:

{(x,x,x):(((z,z,z),(y,y,y)),...}