1. 程式人生 > >python實現完整的求解給定列表中所有的平衡點問題,是所有的平衡點

python實現完整的求解給定列表中所有的平衡點問題,是所有的平衡點

#!usr/bin/env python #encoding:utf-8 from __future__ import division ''' __Author__:沂水寒城 功能:尋找平衡點 ''' def find_balance_point(numbers): ''' 網上的程式碼,尋找平衡點 來源於:http://blog.renren.com/share/235087438/3004327956 測試資料:numbers = [1,3,5,7,8,2,4,20] 缺點:你可以交換列表中的資料可以發現結果錯誤,可能正是他們的對於 平衡點的定義不同,都按照簡單版本的來了 ''' total=sum(numbers) fore=0 for number in numbers: if fore<(total-number)/2: fore+=number else: break if fore == (total-number)/2: print number else: print r'not found' def split_list(num_list): ''' 輸入一個列表,判斷是否可以劃分為大小相等的兩個子列表,可以返回True不可以返回False ''' total=sum(num_list) half=total/2 if int(half)!=half: return False else: all_sub_list=get_list_all_sub_list(num_list) i=0 flag=False while i<len(all_sub_list): one_list=all_sub_list[i] two_list=[one for one in num_list if one not in one_list] if sum(one_list)==sum(two_list): flag=True break else: i+=1 if flag: return True else: return False def main_func(num_list): ''' 輸入一個列表判斷是否存在平衡點 ''' res=False for i in range(len(num_list)): temp_list=num_list[:] flag=temp_list.pop(i) if split_list(temp_list): res=True print '平衡點為:', flag if not res: print '不存在平衡點!!!' def get_list_all_sub_list(num_list): ''' 輸入一個列表,返回該列表所有的子列表,這裡定義的空列表不屬於子列表,故:子列表最小長度為1 ''' if len(num_list)==1: return [num_list] sub_list=get_list_all_sub_list(num_list[:-1]) extra=num_list[-1:] temp_list=[] for one in sub_list: temp_list.append(one+extra) return sub_list+temp_list if __name__ == '__main__': num_list=[1,3,2,4,5,7,8,20] num_list2=[1,3,2,4,5,7,8,200,9000,300000] print '*********************************網上程式碼測試*********************************' find_balance_point(num_list) find_balance_point(num_list2) print '*********************************自己的程式碼測試*********************************' main_func(num_list) print '------------------------------------------------------------------------------------' main_func(num_list2)