【问题标题】:python recursion list passed is not getting updated传递的python递归列表未更新
【发布时间】:2020-07-22 12:02:40
【问题描述】:

如果元素之间有一些共同点,我会尝试递归地合并列表列表。 示例输入:listt=[[0,1],[1,2],[2,3],[4,5,6]] 预期:输出:[[4, 5, 6], [0, 1, 2, 3]]

这是我的功能:

def merge(a, b):
    max_offset = len(b)  # can't overlap with greater size than len(b)
    for i in reversed(range(max_offset+1)):
        # checks for equivalence of decreasing sized slices
        if a[-i:] == b[:i]:
            return [a + b[i:]]
    return [a,b]


def recursive_func_test(listt,final_merged_list):
    something_changed=False
    for i, j in itertools.combinations(list(range(0,len(listt))), 2):    
        merged_list=merge(listt[i],listt[j])
        if len(merged_list)==1:
            final_merged_list.append(merged_list[0])
            something_changed=True
    if something_changed:
        for ele in listt:
            is_sub=False
            for ele_m in final_merged_list:
                if set(ele).issubset(set(ele_m)):
                    is_sub=True
            if not is_sub:
                final_merged_list.append(ele)    
        updated_merged_list=[]
        subset_list=[]
        for a, b in itertools.combinations(list(range(0,len(final_merged_list))), 2):
                if set(final_merged_list[a]).issubset(set(final_merged_list[b])):
                    subset_list.append(a)
                elif set(final_merged_list[b]).issubset(set(final_merged_list[a])):
                    subset_list.append(b)
        for i in range(len(final_merged_list)):
            if i not in subset_list:
                updated_merged_list.append(final_merged_list[i])
        final_merged_list=updated_merged_list
        final_merged_list=recursive_func_test(updated_merged_list,final_merged_list)
    else:
        return final_merged_list

这是我尝试调用该函数的方式:

listt=[[0,1],[1,2],[2,3],[4,5,6]]
final_merged_list=[]
recursive_func_test(listt,final_merged_list)
print(final_merged_list)

问题是我的结果是 [[0, 1, 2], [1, 2, 3], [4, 5, 6]] 这是预期答案之前的一次递归。不确定问题出在哪里,因为当我在函数的开头添加 print 时,final_merged_list 中的值是预期的输出。任何帮助表示赞赏。

【问题讨论】:

    标签: python list recursion


    【解决方案1】:

    在你的合并函数中尝试做:

    a[-1] = b[i]
    

    【讨论】:

    • 问题不在于合并函数,而在于递归处理列表。我无法弄清楚。
    【解决方案2】:

    终于找到答案了:

    始终将中间结果返回给递归的外部调用很重要。在该行之后的代码中

    final_merged_list=recursive_func_test(updated_merged_list,final_merged_list)
    

    必须返回结果,以便在递归结束时返回最里面的结果(最终合并列表)。

    这里是固定代码:

    def recursive_func_test(listt,final_merged_list):
        something_changed=False
        for i, j in itertools.combinations(list(range(0,len(listt))), 2):    
            merged_list=merge(listt[i],listt[j])
            if len(merged_list)==1:
                final_merged_list.append(merged_list[0])
                something_changed=True
        if something_changed:
            for ele in listt:
                is_sub=False
                for ele_m in final_merged_list:
                    if set(ele).issubset(set(ele_m)):
                        is_sub=True
                if not is_sub:
                    final_merged_list.append(ele)    
            updated_merged_list=[]
            subset_list=[]
            for a, b in itertools.combinations(list(range(0,len(final_merged_list))), 2):
                    if set(final_merged_list[a]).issubset(set(final_merged_list[b])):
                        subset_list.append(a)
                    elif set(final_merged_list[b]).issubset(set(final_merged_list[a])):
                        subset_list.append(b)
            for i in range(len(final_merged_list)):
                if i not in subset_list:
                    updated_merged_list.append(final_merged_list[i])
            final_merged_list=updated_merged_list
            final_merged_list=recursive_func_test(updated_merged_list,final_merged_list)
            return final_merged_list
        else:
            return final_merged_list
    

    另外,可以避免传递额外的列表,代码可以进一步简化,如下所示:

    def recursive_func_test(listt):
        input_list=listt[:]
        something_changed=False
        final_merged_list=[]
        for i, j in itertools.combinations(list(range(0,len(listt))), 2): 
            merged_list=merge(listt[i],listt[j])
            if len(merged_list)==1:
                final_merged_list.append(merged_list[0])
                something_changed=True
        if something_changed:
            for ele in listt:
                is_sub=False
                for ele_m in final_merged_list:
                    if set(ele).issubset(set(ele_m)):
                        is_sub=True
                if not is_sub:
                    final_merged_list.append(ele)    
            
            subset_list=[]
            for a, b in itertools.combinations(list(range(0,len(final_merged_list))), 2):
                    if set(final_merged_list[a]).issubset(set(final_merged_list[b])):
                        subset_list.append(a)
                    elif set(final_merged_list[b]).issubset(set(final_merged_list[a])):
                        subset_list.append(b)
            
            for index in subset_list:
                final_merged_list.pop(index)
            listt=final_merged_list[:]
            result=recursive_func_test(listt)
            return result
        else:
            return listt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-07
      • 2021-12-12
      • 2021-12-21
      • 1970-01-01
      • 2018-01-16
      • 2012-12-18
      • 1970-01-01
      • 2020-06-12
      相关资源
      最近更新 更多