所有可能的情况

2024-09-29 01:28:02 发布

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

我想生成所有可能的结合条件。假设我有一个数据帧包含我需要的条件。在

Variable     Cluster_no sub_group
GDP_M3       1          GDP
HPI_M3_lg2   1          HPI
FDI_C_lg5    1          FDI
FDI_M6       2          FDI
Export_M9    2          Export
GDP_M9       2          GDP
GDP_M12_lg7  3          GDP
Export_M12   3          Export

我发现itertools.combinations给出了3的所有可能的组合。但是,我想考虑更多关于cluster_no和{}的标准。在

我已经说过,如果我从cluster 1开始,它将不会与HPI_M3_lg2或{}匹配,因为它来自同一个集群。给定集群条件,它将查找其他集群,它们是cluster 2或{}。在

cluster 2中,有两个可能的变量,它们是FDI_M6或{},因为我也想考虑sub_group条件。如果选择FDI_M6,它将移动到下一个集群,因为同样,每个集群只允许有1个变量。在

现在,我的列表是[GDP_M3, FDI_M6]。组合的下一个变量是Export_M12,因为它来自cluster 3和{}。在

我想设置3个可能的组合(1到3)。有什么建议吗。在

谢谢。在

编辑以添加我的代码。在

^{pr2}$

Tags: 数据nogroup集群export条件m3cluster
2条回答

我不认为用内置的组合方法可以处理这种情况。你必须编写自己的回溯组合算法。我已经尝试过实现一个:

all_possible_combinations = []
def get_combinations(N, data, cur_index=0, generated_el=[], cluster_tracker=set(), sub_group_tracker=set()):
    if N == 0:
        if generated_el:
            all_possible_combinations.append(tuple(generated_el))
        return

    if cur_index >= len(data):
        return

    get_combinations(N, data, cur_index+1, generated_el, cluster_tracker, sub_group_tracker)

    if data[cur_index][1] in cluster_tracker:
        # I have already taken this cluster
        return

    if data[cur_index][2] in sub_group_tracker:
        # I have already taken this sub group
        return

    generated_el.append(data[cur_index][0])
    cluster_tracker.add(data[cur_index][1])
    sub_group_tracker.add(data[cur_index][2])
    get_combinations(N-1, data, cur_index+1, generated_el, cluster_tracker, sub_group_tracker)  
    generated_el.pop()
    cluster_tracker.remove(data[cur_index][1])
    sub_group_tracker.remove(data[cur_index][2])

    return


if __name__ == "__main__":
    data = [
        ("GDP_M3", "1", "GDP"),
        ("HPI_M3_lg2", "1", "HPI" ),
        ("FDI_C_lg5", "1", "FDI"),
        ("FDI_M6", "2", "FDI"),
        ("Export_M9", "2", "Export"),
        ("GDP_M9", "2", "GDP"),
        ("GDP_M12_lg7", "3", "GDP"),
        ("Export_M12", "3", "Export")
    ]

    get_combinations(3, data)
    print(all_possible_combinations)

您可以在这里看到输出:https://ideone.com/HwruJ7

我的方法类似于@Ahmad Faiyaz

from collections import defaultdict
x= [[1,1,'gdp'],[2,1,'hpi'],[3,1,'fdi'],[4,2,'fdi'],[5,2,'export'],[6,2,'gdp'],[7,3,'gdp'],[8,3,'export']]
c=defaultdict(list)
for i in x:
    c[i[1]]+=[i]

def rec_cal(i,clus,lis):
    if i in c.keys():
        for j in c[i]:
            if j[2] not in clus:
                clus.append(j[2])
                lis.append(j[0])
                rec_cal(i+1,clus,lis)
                clus.pop()
                lis.pop()
            else:
                continue
    else:
        print(lis)

rec_cal(1,[],[])

你得到的输出是

^{pr2}$

该方法首先在字典的帮助下构建一个集群集合,然后递归地通过考虑子组的集群来创建最终输出。现在我只需打印它,但你可以很容易地捕捉到它

相关问题 更多 >