【问题标题】:All possible combination with condition与条件的所有可能组合
【发布时间】:2018-09-11 16:52:44
【问题描述】:

我想在某些条件下生成所有可能的组合。鉴于我有一个包含我需要的条件的数据框。

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_nosub_group 的更多标准。

话虽如此,如果我从cluster 1 开始以GDP_M3 开头,它不会与HPI_M3_lg2FDI_C_lg5 匹配,因为它来自同一个集群。给定集群条件,它将寻找其他集群,即cluster 2cluster 3

cluster 2 中,有两个可能的变量,即FDI_M6Export_M9,因为我也想考虑sub_group 条件。如果选择FDI_M6,它将移动到下一个集群,因为每个集群只允许一个变量。

目前,我的名单是[GDP_M3, FDI_M6]。组合的下一个变量是Export_M12,因为它来自cluster 3sub_group Export

我想设置最多 3 种可能的组合(1 到 3)。对此有任何建议。

谢谢。

编辑以添加我的代码。

N=3
combination=[]

for i in range(1, N+1):
    for j in itertools.combinations(a, i):
        combination.append(list(j))  

【问题讨论】:

  • 如果您可以向我们提供您尝试过的代码,那就很清楚了
  • 为什么不对变量本身进行组合,将每个集群中的组合数作为属于该变量的集群的唯一值?用你需要的所有条件迭代一个 for 循环
  • @NiteyaShah 因为我需要与其他集群的变量组合。如果我在每个集群中进行组合,GDP_M3 将无法与 Export_M12 匹配。
  • 我的意思是嵌套的 for 循环,即 for i in var1: for j in var2 if(i==j): pass
  • @Netwave 已修改

标签: python combinations


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的方法类似于@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,[],[])
    

    你得到的输出为

    [1, 4, 8]
    [2, 4, 7]
    [2, 4, 8]
    [2, 5, 7]
    [2, 6, 8]
    [3, 5, 7]
    [3, 6, 8]
    

    此方法首先在字典的帮助下构建集群集合,然后递归遍历集群并考虑子组以创建最终输出。现在我只是打印它,但您可以轻松捕获它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多