猿问

Python - 如何从嵌套列表中获取所有可能的组合

我有一个像这样的嵌套列表:


values = [['DNO', 0.2], ['Equinor', 0.4], ['Petoro', 0.2], ['Total', 0.2]]

如何获得总和(每个子列表的第二个元素)大于 0.5 的所有可能的元素组合?


这就是我正在使用的:


def getCombinations(values, min_len):

    combo = "\n"

    numbers = []

    doc = {}

    for val in values:

        doc[val[0]] = val[1]

        numbers.append(val[1])


    result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) >= 0.5]

    temp = doc.copy()


    for r in result:

        doc = temp.copy()

        if len(r) >= min_len:

            for rr in r:

                combo = combo + get_key(doc, rr) + " "


                doc.pop(get_key(doc, rr))

            combo = combo + "\n"

    return combo

当上面列表中有多个值(例如 0.2)时,我的算法会出现一些问题。


目前它返回的是min_length=3:


Total Equinor Petoro DNO

Total Equinor Petoro 

Total Equinor Petoro 

Total Petoro DNO 

Equinor Total Petoro 


喵喔喔
浏览 145回答 2
2回答

月关宝盒

您可以使用这样的列表理解:解释:第一个for定义了组合的长度。values使用从 2 到 的长度的每个长度。第二个for创建实际组合使用if生成器方法对项目数进行求和from itertools import combinationscombis = [    item    for length in range(2, len(values)+1)    for item in combinations(values, length)    if sum(i[1] for i in item) >= 0.5]

jeck猫

以下应该有效:import itertools  result=[] for k in range(2,len(values)+1):    temp=[tuple(x[0] for x in i) for i in list(itertools.combinations(values,k))if sum([p[1] for p in i]) >0.5]    result.append(temp)result=sum(result, [])print(result)输出:[('DNO', 'Equinor'), ('Equinor', 'Petoro'), ('Equinor', 'Total'), ('DNO', 'Equinor', 'Petoro'), ('DNO', 'Equinor', 'Total'), ('DNO', 'Petoro', 'Total'), ('Equinor', 'Petoro', 'Total'), ('DNO', 'Equinor', 'Petoro', 'Total')]
随时随地看视频慕课网APP

相关分类

Python
我要回答