From 1ab67e8bf036626416a73a0eb1450436a1aedd1d Mon Sep 17 00:00:00 2001 From: "xiaofei.ding" Date: Mon, 23 Oct 2017 15:01:52 +0800 Subject: [PATCH] init & reformat code --- .gitignore | 1 + 2d_list.py | 37 ++++++------ ahead_one_step.py | 6 +- average_score.py | 25 ++++---- big_int.py | 104 +++++++++++++++++---------------- bin_search.py | 37 +++++++----- binary_tree.py | 14 ++--- binary_tree2.py | 31 +++++----- binary_tree_traversal.py | 17 +++--- change_coin.py | 58 +++++++++--------- chinesetokenizer.py | 42 +++++++------ delete_space.py | 11 ++-- dijkstra_algorithm.py | 27 ++++----- divide.py | 32 +++++----- even_odd.py | 18 +++--- fibonacci.py | 51 +++++++++------- half_search.py | 41 ++++++------- heap_sort.py | 10 ++-- int_divide.py | 25 ++++---- int_divide2.py | 27 +++++---- is_prime.py | 39 +++++++------ joint_int.py | 8 +-- kruskal_algorithm.py | 33 ++++++----- kruskal_algorithm2.py | 32 +++++----- longest_increasing_sequence.py | 52 +++++++++-------- max_sum.py | 5 +- merge_sort.py | 20 ++++--- most_char_num.py | 24 ++++---- most_char_num2.py | 16 ++--- operate_int_list.py | 33 ++++++----- perfect_number.py | 24 ++++---- prim_algorithm.py | 42 ++++++------- quick_sort.py | 24 ++++---- random_list.py | 11 ++-- same_element_in_list.py | 25 ++++---- sort_chared.py | 32 +++++----- string_to_hump.py | 17 +++--- sudoku.py | 51 ++++++++-------- 38 files changed, 584 insertions(+), 518 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/2d_list.py b/2d_list.py index 87555a2..007212d 100644 --- a/2d_list.py +++ b/2d_list.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题 @@ -13,28 +13,29 @@ import random -def score(score_list,course_list,student_num): +def score(score_list, course_list, student_num): course_num = len(course_list) - + every_score = [[score_list[j][i] for j in range(course_num)] for i in range(student_num)] - + every_total = [sum(every_score[i]) for i in range(student_num)] - - ave_course = [sum(score_list[i])/len(score_list[i]) for i in range(len(score_list))] - - return (every_score,every_total,ave_course) - -if __name__=="__main__": - - course_list = ["C++","Java","Servlet","JSP","EJB"] + + ave_course = [sum(score_list[i]) / len(score_list[i]) for i in range(len(score_list))] + + return (every_score, every_total, ave_course) + + +if __name__ == "__main__": + + course_list = ["C++", "Java", "Servlet", "JSP", "EJB"] student_num = 20 - - score_list = [[random.randint(0,100) for i in range(student_num)] for j in range(len(course_list))] + + score_list = [[random.randint(0, 100) for i in range(student_num)] for j in range(len(course_list))] for i in range(len(course_list)): - print "score of every one in %s:"%course_list[i] + print "score of every one in %s:" % course_list[i] print score_list[i] - every_score,every_total,ave_one_course = score(score_list,course_list,student_num) + every_score, every_total, ave_one_course = score(score_list, course_list, student_num) print "\n" print "NEXT IS EVERY ONE SCORE IN EVERY COURSE:" for name in course_list: @@ -42,5 +43,5 @@ def score(score_list,course_list,student_num): print "\t" print every_score print "\n" - print "every one all score:\t",every_total - print "every course of average score:\t",ave_one_course + print "every one all score:\t", every_total + print "every course of average score:\t", ave_one_course diff --git a/ahead_one_step.py b/ahead_one_step.py index bb880e3..504acaf 100644 --- a/ahead_one_step.py +++ b/ahead_one_step.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题: @@ -9,11 +9,13 @@ 即,a[0]=a[1],a[1]=a[2],…最后一个元素的值是原来第一个元素的值,然后输出这个数组。 """ + def ahead_one(): a = [i for i in range(1, 11)] b = a.pop(0) a.append(b) return a -if __name__ =="__main__": + +if __name__ == "__main__": print ahead_one() diff --git a/average_score.py b/average_score.py index cb8c05a..df954f5 100644 --- a/average_score.py +++ b/average_score.py @@ -1,5 +1,5 @@ #! /usr/bin python -#coding:utf-8 +# coding:utf-8 """ 问题: @@ -8,23 +8,26 @@ (2)将这40个成绩按照从高到低的顺序输出出来。 """ -#no need to import division from future just change num to float(num) +# no need to import division from future just change num to float(num) import random + def make_score(num): - score = [random.randint(0,100) for i in range(num)] + score = [random.randint(0, 100) for i in range(num)] return score + def less_average(score): num = len(score) sum_score = sum(score) - ave_num = sum_score/float(num) - less_ave = [i for i in score if i'09' - str_martix = [map(convert_to_str,int_martix[i]) for i in range(len(int_martix))] - - #将上述各个list中的两位数字分开:['01','29','03']-->[0,2,0],[1,9,3] - martix = [[int(str_martix[i][j][z]) for j in range(len(str_martix[i]))] for i in range(len(str_martix)) for z in range(2)] - - #计算阿拉伯乘法表的左侧开始各项和 + # 两个list中整数两两相乘 + int_martix = [[i * j for i in num_lst1] for j in num_lst2] + + # 将上述元素为数字的list转化为元素类型是str,主要是将9-->'09' + str_martix = [map(convert_to_str, int_martix[i]) for i in range(len(int_martix))] + + # 将上述各个list中的两位数字分开:['01','29','03']-->[0,2,0],[1,9,3] + martix = [[int(str_martix[i][j][z]) for j in range(len(str_martix[i]))] for i in range(len(str_martix)) for z in + range(2)] + + # 计算阿拉伯乘法表的左侧开始各项和 sum_left = summ_left(martix) - #计算阿拉伯乘法表的底部开始各项和 + # 计算阿拉伯乘法表的底部开始各项和 sum_end = summ_end(martix) - #将上述两个结果合并后翻转 + # 将上述两个结果合并后翻转 sum_left.extend(sum_end) sum_left.reverse() - #取得各个和的个位的数字(如果进位则加上) + # 取得各个和的个位的数字(如果进位则加上) result = take_digit(sum_left) - - #翻转结果并合并为一个结果字符串数值 + + # 翻转结果并合并为一个结果字符串数值 result.reverse() int_result = "".join(result) - print "%d*%d="%(num1,num2) + print "%d*%d=" % (num1, num2) print int_result -#将int类型转化为str类型,9-->'09' +# 将int类型转化为str类型,9-->'09' def convert_to_str(num): - if num<10: - return "0"+str(num) + if num < 10: + return "0" + str(num) else: return str(num) -#计算阿拉伯乘法表格左侧开始的各项之和 +# 计算阿拉伯乘法表格左侧开始的各项之和 def summ_left(lst): summ = [] x = [i for i in range(len(lst))] y = [j for j in range(len(lst[0]))] - sx = [i for i in x if i%2==0] + sx = [i for i in x if i % 2 == 0] for i in sx: - s=0 - j=0 - while i>=0 and j<=y[-1]: - s = s+ lst[i][j] - if i%2==1: - j = j+1 + s = 0 + j = 0 + while i >= 0 and j <= y[-1]: + s = s + lst[i][j] + if i % 2 == 1: + j = j + 1 else: j = j - i = i-1 + i = i - 1 summ.append(s) return summ - -#计算阿拉伯乘法表格底部开始的各项之和 +# 计算阿拉伯乘法表格底部开始的各项之和 def summ_end(lst): - summ=[] + summ = [] y = [j for j in range(len(lst[0]))] - ex = len(lst)-1 + ex = len(lst) - 1 for m in range(len(y)): s = 0 - i=ex - j=m - while i>=0 and j<=y[-1]: - s= s+lst[i][j] - if i%2==1: - j = j+1 + i = ex + j = m + while i >= 0 and j <= y[-1]: + s = s + lst[i][j] + if i % 2 == 1: + j = j + 1 else: - j=j - i = i-1 + j = j + i = i - 1 summ.append(s) - + return summ -#得到各个元素的个位数,如果是大于10则向下一个进位 + +# 得到各个元素的个位数,如果是大于10则向下一个进位 def take_digit(lst): tmp = 0 digit_list = [] for m in range(len(lst)): lstm = 0 - lstm = lst[m]+tmp - if lstm<10: + lstm = lst[m] + tmp + if lstm < 10: tmp = 0 digit_list.append(str(lstm)) else: - tmp = lstm/10 - mm = lstm-tmp*10 + tmp = lstm / 10 + mm = lstm - tmp * 10 digit_list.append(str(mm)) return digit_list -if __name__=="__main__": - arabic_multiplication(469,37) +if __name__ == "__main__": + arabic_multiplication(469, 37) diff --git a/bin_search.py b/bin_search.py index 7eb873f..651b72b 100644 --- a/bin_search.py +++ b/bin_search.py @@ -1,5 +1,5 @@ #!/usr/bin/evn python -#coding:utf-8 +# coding:utf-8 """ #问题 @@ -32,21 +32,23 @@ 这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn) """ -def binarySearch(lst, value,low,high): #low,high是lst的查找范围 + +def binarySearch(lst, value, low, high): # low,high是lst的查找范围 if high < low: return -1 - mid = (low + high)/2 + mid = (low + high) / 2 if lst[mid] > value: - return binarySearch(lst, value, low, mid-1) + return binarySearch(lst, value, low, mid - 1) elif lst[mid] < value: - return binarySearch(lst, value, mid+1, high) + return binarySearch(lst, value, mid + 1, high) else: return mid -#也可以不用递归方法,而采用循环,如下: - + +# 也可以不用递归方法,而采用循环,如下: + def bsearch(l, value): - lo, hi = 0, len(l)-1 + lo, hi = 0, len(l) - 1 while lo <= hi: mid = (lo + hi) / 2 if l[mid] < value: @@ -56,7 +58,8 @@ def bsearch(l, value): else: return mid return -1 - + + """ 对于python,不能忽视其强大的标准库。经查阅,发现标准库中就有一个模块,名为:bisect。其文档中有这样一句话: @@ -76,16 +79,18 @@ def bsearch(l, value): -关于本模块,可以查看官方文档:https://docs.python.org/2/library/bisect.html """ -#下面演示这个模块 +# 下面演示这个模块 from bisect import * -def bisectSearch(lst, x): - i = bisect_left(lst, x) #bisect_left(lst,x)得到x在已经排序的lst中的位置 + +def bisectSearch(lst, x): + i = bisect_left(lst, x) # bisect_left(lst,x)得到x在已经排序的lst中的位置 if i != len(lst) and lst[i] == x: return i -if __name__=="__main__": - lst = sorted([2,5,3,8]) - print bisectSearch(lst,5) - print bsearch(lst,5) + +if __name__ == "__main__": + lst = sorted([2, 5, 3, 8]) + print bisectSearch(lst, 5) + print bsearch(lst, 5) diff --git a/binary_tree.py b/binary_tree.py index 770cc5e..6a3cfab 100644 --- a/binary_tree.py +++ b/binary_tree.py @@ -1,10 +1,11 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 class Node: """ 二叉树左右枝 """ + def __init__(self, data): """ 节点结构 @@ -48,9 +49,9 @@ def delete(self, data): """ 删除节点 """ - node, parent = self.lookup(data) #已有节点 + node, parent = self.lookup(data) # 已有节点 if node is not None: - children_count = node.children_count() #判断子节点数 + children_count = node.children_count() # 判断子节点数 if children_count == 0: # 如果该节点下没有子节点,即可删除 if parent.left is node: @@ -105,7 +106,7 @@ def compare_trees(self, node): else: res = self.right.compare_trees(node.right) return res - + def print_tree(self): """ 按顺序打印数的内容 @@ -122,11 +123,11 @@ def tree_data(self): """ stack = [] node = self - while stack or node: + while stack or node: if node: stack.append(node) node = node.left - else: + else: node = stack.pop() yield node.data node = node.right @@ -141,4 +142,3 @@ def children_count(self): if self.right: cnt += 1 return cnt - diff --git a/binary_tree2.py b/binary_tree2.py index 982980d..452d1de 100644 --- a/binary_tree2.py +++ b/binary_tree2.py @@ -1,28 +1,28 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 # The code is from:http://code.activestate.com/recipes/286239-binary-ordered-tree/ # A binary ordered tree example class CNode: - left , right, data = None, None, 0 - + left, right, data = None, None, 0 + def __init__(self, data): # initializes the data members self.left = None self.right = None self.data = data - + class CBOrdTree: def __init__(self): # initializes the root member self.root = None - + def addNode(self, data): # creates a new node and returns it return CNode(data) - + def insert(self, root, data): # inserts a new data if root == None: @@ -39,7 +39,7 @@ def insert(self, root, data): # processes the right-sub-tree root.right = self.insert(root.right, data) return root - + def lookup(self, root, target): # looks for a value into the tree if root == None: @@ -55,14 +55,14 @@ def lookup(self, root, target): else: # right side return self.lookup(root.right, target) - + def minValue(self, root): # goes down into the left # arm and returns the last value - while(root.left != None): + while (root.left != None): root = root.left return root.data - + def maxDepth(self, root): if root == None: return 0 @@ -72,13 +72,13 @@ def maxDepth(self, root): rdepth = self.maxDepth(root.right) # returns the appropriate depth return max(ldepth, rdepth) + 1 - + def size(self, root): if root == None: return 0 else: return self.size(root.left) + 1 + self.size(root.right) - + def printTree(self, root): # prints the tree path if root == None: @@ -87,7 +87,7 @@ def printTree(self, root): self.printTree(root.left) print root.data, self.printTree(root.right) - + def printRevTree(self, root): # prints the tree path in reverse # order @@ -97,7 +97,8 @@ def printRevTree(self, root): self.printRevTree(root.right) print root.data, self.printRevTree(root.left) - + + if __name__ == "__main__": # create the binary tree BTree = CBOrdTree() @@ -109,7 +110,7 @@ def printRevTree(self, root): # insert values BTree.insert(root, data) print - + BTree.printTree(root) print BTree.printRevTree(root) diff --git a/binary_tree_traversal.py b/binary_tree_traversal.py index ccd5092..14166c0 100644 --- a/binary_tree_traversal.py +++ b/binary_tree_traversal.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ #问题 @@ -8,7 +8,7 @@ from collections import namedtuple from sys import stdout - + Node = namedtuple('Node', 'data, left, right') tree = Node(1, Node(2, @@ -23,7 +23,7 @@ None)) -#前序(pre-order,NLR) +# 前序(pre-order,NLR) def preorder(node): if node is not None: @@ -32,7 +32,7 @@ def preorder(node): preorder(node.right) -#中序(in-order,LNR) +# 中序(in-order,LNR) def inorder(node): if node is not None: @@ -41,7 +41,7 @@ def inorder(node): inorder(node.right) -#后序(post-order,LRN) +# 后序(post-order,LRN) def postorder(node): if node is not None: @@ -50,7 +50,7 @@ def postorder(node): print node.data, -#层序(level-order) +# 层序(level-order) def levelorder(node, more=None): if node is not None: @@ -58,9 +58,10 @@ def levelorder(node, more=None): more = [] more += [node.left, node.right] print node.data, - if more: + if more: levelorder(more[0], more[1:]) - + + print ' preorder: ', preorder(tree) print '\t\n inorder: ', diff --git a/change_coin.py b/change_coin.py index a8aa762..076ce4f 100644 --- a/change_coin.py +++ b/change_coin.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题: @@ -13,58 +13,60 @@ 这个算法的问题在于,得出来的结果不一定是最有结果。比如,硬币单位是[1,4,6],如果将8兑换成硬币,按照硬币数量最少原则,应该兑换成为两个4(单位)的硬币,但是,按照本算法,得到的结果是一个6单位和两个1单位的硬币。这也是本算法的局限所在。所谓贪婪算法,本质就是只要找出一个结果,不考虑以后会怎么样。 """ + def change_coin(money): - coin = [1,2,5,10,20,50,100] #1分,2分,5分,1角,2角,5角,1元 + coin = [1, 2, 5, 10, 20, 50, 100] # 1分,2分,5分,1角,2角,5角,1元 coin.sort(reverse=True) - money = money*100 #以分为单位进行计算 + money = money * 100 # 以分为单位进行计算 change = {} for one in coin: - num_coin = money//one #除法,取整,得到该单位硬币的个数 - if num_coin>0: - change[one]=num_coin - num_remain = money%one #取余数,得到剩下的钱数 - if num_remain==0: + num_coin = money // one # 除法,取整,得到该单位硬币的个数 + if num_coin > 0: + change[one] = num_coin + num_remain = money % one # 取余数,得到剩下的钱数 + if num_remain == 0: break else: money = num_remain - return change + return change + -#以下方法,以动态方式,提供最小的硬币数量。避免了贪婪方法的问题。 +# 以下方法,以动态方式,提供最小的硬币数量。避免了贪婪方法的问题。 def coinChange(centsNeeded, coinValues): minCoins = [[0 for j in range(centsNeeded + 1)] for i in range(len(coinValues))] minCoins[0] = range(centsNeeded + 1) - - for i in range(1,len(coinValues)): + + for i in range(1, len(coinValues)): for j in range(0, centsNeeded + 1): if j < coinValues[i]: - minCoins[i][j] = minCoins[i-1][j] + minCoins[i][j] = minCoins[i - 1][j] else: - minCoins[i][j] = min(minCoins[i-1][j], 1 + minCoins[i][j-coinValues[i]]) + minCoins[i][j] = min(minCoins[i - 1][j], 1 + minCoins[i][j - coinValues[i]]) return minCoins[-1][-1] -if __name__=="__main__": + +if __name__ == "__main__": money = 3.42 - coin = [1,2,5,10,20,50,100] #1分,2分,5分,1角,2角,5角,1元 + coin = [1, 2, 5, 10, 20, 50, 100] # 1分,2分,5分,1角,2角,5角,1元 num_coin = change_coin(money) - result = [(key,num_coin[key]) for key in sorted(num_coin.keys())] - print "You have %s RMB"%money + result = [(key, num_coin[key]) for key in sorted(num_coin.keys())] + print "You have %s RMB" % money print "I had to change you:" print " Coin Number" for i in result: - if i[0]==100: - print "Yuan %d %d"%(i[0]/100,i[1]) - elif i[0]<10: - print "Fen %d %d"%(i[0],i[1]) + if i[0] == 100: + print "Yuan %d %d" % (i[0] / 100, i[1]) + elif i[0] < 10: + print "Fen %d %d" % (i[0], i[1]) else: - print "Jiao %d %d"%(i[0]/10,i[1]) - num2 = coinChange(5,coin) + print "Jiao %d %d" % (i[0] / 10, i[1]) + num2 = coinChange(5, coin) print num2 -#执行结果 -#You have 3.42 RMB -#I had to change you: +# 执行结果 +# You have 3.42 RMB +# I had to change you: # Coin Number # Fen 2 1 # Jiao 2 2 # Yuan 1 3 - diff --git a/chinesetokenizer.py b/chinesetokenizer.py index db46bc6..bd7bf50 100644 --- a/chinesetokenizer.py +++ b/chinesetokenizer.py @@ -1,30 +1,34 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -#本代码来自网络:http://ashin.sinaapp.com/article/118/ +# 本代码来自网络:http://ashin.sinaapp.com/article/118/ import jieba -from whoosh.analysis import Tokenizer,Token +from whoosh.analysis import Tokenizer, Token from whoosh.compat import text_type -class ChineseTokenizer(Tokenizer): - def __call__(self, value, positions=False, chars=False, keeporiginal=False, removestops=True, start_pos=0, start_char=0, mode='', **kwargs): - assert isinstance(value, text_type), "%r is not unicode" % value - t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs) - seglist=jieba.cut_for_search(value) #使用结巴分词库进行分词 - for w in seglist: - t.original = t.text = w - t.boost = 1.0 - if positions: - t.pos=start_pos+value.find(w) - if chars: - t.startchar=start_char+value.find(w) - t.endchar=start_char+value.find(w)+len(w) - yield t #通过生成器返回每个分词的结果token - -def ChineseAnalyzer(): + +class ChineseTokenizer(Tokenizer): + def __call__(self, value, positions=False, chars=False, keeporiginal=False, removestops=True, start_pos=0, + start_char=0, mode='', **kwargs): + assert isinstance(value, text_type), "%r is not unicode" % value + t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs) + seglist = jieba.cut_for_search(value) # 使用结巴分词库进行分词 + for w in seglist: + t.original = t.text = w + t.boost = 1.0 + if positions: + t.pos = start_pos + value.find(w) + if chars: + t.startchar = start_char + value.find(w) + t.endchar = start_char + value.find(w) + len(w) + yield t # 通过生成器返回每个分词的结果token + + +def ChineseAnalyzer(): return ChineseTokenizer() + """ 测试脚本: diff --git a/delete_space.py b/delete_space.py index 5ea6af0..fa37943 100644 --- a/delete_space.py +++ b/delete_space.py @@ -1,14 +1,15 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -#删除一个字符串中连续超过一次的空格。 +# 删除一个字符串中连续超过一次的空格。 def del_space(string): - split_string = string.split(" ") #以空格为分割,生成list,list中如果含有空格,则该空格是连续空格中的后一个 - string_list = [i for i in string if i!=""] + split_string = string.split(" ") # 以空格为分割,生成list,list中如果含有空格,则该空格是连续空格中的后一个 + string_list = [i for i in string if i != ""] result_string = " ".join(string_list) return result_string -if __name__=="__main__": + +if __name__ == "__main__": one_str = "Hello, I am Qiwsir." string = del_space(one_str) print one_str diff --git a/dijkstra_algorithm.py b/dijkstra_algorithm.py index 965ab20..c11bf22 100644 --- a/dijkstra_algorithm.py +++ b/dijkstra_algorithm.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 最短路径问题的Dijkstra算法 @@ -14,38 +14,39 @@ from priodict import priorityDictionary -def Dijkstra(G,start,end=None): + +def Dijkstra(G, start, end=None): D = {} # dictionary of final distances P = {} # dictionary of predecessors - Q = priorityDictionary() # est.dist. of non-final vert. + Q = priorityDictionary() # est.dist. of non-final vert. Q[start] = 0 - + for v in Q: D[v] = Q[v] if v == end: break - + for w in G[v]: vwLength = D[v] + G[v][w] if w in D: if vwLength < D[w]: raise ValueError, "Dijkstra: found better path to already-final vertex" - + elif w not in Q or vwLength < Q[w]: Q[w] = vwLength P[w] = v - - return (D,P) -def shortestPath(G,start,end): - D,P = Dijkstra(G,start,end) + return (D, P) + + +def shortestPath(G, start, end): + D, P = Dijkstra(G, start, end) Path = [] while 1: - + Path.append(end) if end == start: break end = P[end] - + Path.reverse() return Path - diff --git a/divide.py b/divide.py index 5f38a11..61065b0 100644 --- a/divide.py +++ b/divide.py @@ -1,33 +1,32 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 def divide(numerator, denominator, detect_repetition=True, digit_limit=None): - # 如果是无限小数,必须输入限制的返回小数位数:digit_limit # digit_limit = 5,表示小数位数5位,注意这里的小数位数是截取,不是四舍五入. if not detect_repetition and digit_limit == None: return None decimal_found = False - + v = numerator // denominator numerator = 10 * (numerator - v * denominator) answer = str(v) - + if numerator == 0: return answer - + answer += '.' - + # Maintain a list of all the intermediate numerators # and the length of the output at the point where that # numerator was encountered. If you encounter the same # numerator again, then the decimal repeats itself from # the last index that numerator was encountered at. states = {} - + while numerator > 0 and (digit_limit == None or digit_limit > 0): - + if detect_repetition: prev_state = states.get(numerator, None) if prev_state != None: @@ -43,19 +42,18 @@ def divide(numerator, denominator, detect_repetition=True, digit_limit=None): numerator *= 10 if digit_limit != None: digit_limit -= 1 - - + if numerator > 0: return answer + '...' return answer -if __name__=="__main__": + +if __name__ == "__main__": print "5divide2", - print divide(5,2) + print divide(5, 2) print "10divide3", - print divide(10,3) - print divide(10,3,5) + print divide(10, 3) + print divide(10, 3, 5) print "15divide7" - print divide(15,7) - print divide(15,7,True,3) - + print divide(15, 7) + print divide(15, 7, True, 3) diff --git a/even_odd.py b/even_odd.py index 42b4ee3..2473132 100644 --- a/even_odd.py +++ b/even_odd.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 ''' #way1 @@ -19,11 +19,15 @@ def odd_even_sort(lst): ''' -#way2 -def odd(x):return x%2==1 -def even(x):return x%2==0 +# way2 -if __name__=="__main__": - test_lst = [7,9,12,5,4,9,8,3,12,89] - print filter(even,test_lst)+filter(odd,test_lst) +def odd(x): return x % 2 == 1 + + +def even(x): return x % 2 == 0 + + +if __name__ == "__main__": + test_lst = [7, 9, 12, 5, 4, 9, 8, 3, 12, 89] + print filter(even, test_lst) + filter(odd, test_lst) diff --git a/fibonacci.py b/fibonacci.py index abce985..f6cfb74 100644 --- a/fibonacci.py +++ b/fibonacci.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ Fibonacci数列定义: @@ -10,57 +10,65 @@ """ -#递归,根据定义直接写 -#这种方法不是一个好方法,因为它的开销太大,比如计算fib1(100),就需要耐心等待较长一段时间了。 + +# 递归,根据定义直接写 +# 这种方法不是一个好方法,因为它的开销太大,比如计算fib1(100),就需要耐心等待较长一段时间了。 def fib1(n): - if n==0: + if n == 0: return 0 - elif n==1: + elif n == 1: return 1 else: - return fib1(n-1) + fib1(n-2) + return fib1(n - 1) + fib1(n - 2) + +# 递归,进行初始化 +# fib1的慢,就是因为每次都要计算前面已经算过的项目.这里将上述算法进行稍微改进。 + +memo = {0: 0, 1: 1} -#递归,进行初始化 -#fib1的慢,就是因为每次都要计算前面已经算过的项目.这里将上述算法进行稍微改进。 -memo = {0:0, 1:1} def fib2(n): if not n in memo: - memo[n] = fib2(n-1)+fib2(n-2) + memo[n] = fib2(n - 1) + fib2(n - 2) return memo[n] -#迭代 + +# 迭代 def fib3(n): a, b = 0, 1 for i in range(n): - a, b = b, a+b + a, b = b, a + b return a -#除了上述方法之外,还可以直接用数学运算的结果 -#推荐参考:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97中的结论 -#这种方法来自:http://www.cprogramto.com/fibonacci-sequence-python-code/ +# 除了上述方法之外,还可以直接用数学运算的结果 +# 推荐参考:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97中的结论 + +# 这种方法来自:http://www.cprogramto.com/fibonacci-sequence-python-code/ print('!* Fibonacci Sequence python \n') + + def Fibonacci_Series(): x = input('Enter Series length to print fibonacci sequence') - d,e=0,1 + d, e = 0, 1 a = [] a.append(d) a.append(e) - while(x!=2): + while (x != 2): c = d + e d = e e = c a.append(c) - x = x -1 + x = x - 1 print(a) -#Output: + +# Output: """ !* Fibonacci Sequence python @@ -69,6 +77,5 @@ def Fibonacci_Series(): [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] >>> """ -if __name__=="__main__": - - Fibonacci_Series() +if __name__ == "__main__": + Fibonacci_Series() diff --git a/half_search.py b/half_search.py index 4b96740..7eed493 100644 --- a/half_search.py +++ b/half_search.py @@ -1,37 +1,38 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -#折半查找某个元素在list中的位置 +# 折半查找某个元素在list中的位置 -def half_search(lst,value,left,right): +def half_search(lst, value, left, right): length = len(lst) - while leftvalue: - right = middle-1 - elif lst[middle] value: + right = middle - 1 + elif lst[middle] < value: + left = middle + 1 else: - return middle + return middle -#如果该元素在list中不止一个,可以用下面方法找出所有位置分布 + # 如果该元素在list中不止一个,可以用下面方法找出所有位置分布 -def find_value_location(lst,value): - result = [i for i in range(len(lst)) if value==lst[i]] + +def find_value_location(lst, value): + result = [i for i in range(len(lst)) if value == lst[i]] return result -if __name__=="__main__": - lst=sorted([2,4,4,5,9]) +if __name__ == "__main__": + lst = sorted([2, 4, 4, 5, 9]) length = len(lst) left = 0 - right = length-1 - value =4 - result = half_search(lst,value,left,right) + right = length - 1 + value = 4 + result = half_search(lst, value, left, right) if result: print result else: print "There is no the value that you want to search." - lst2=[2,4,5,4,2] - result2 = find_value_location(lst2,4) + lst2 = [2, 4, 5, 4, 2] + result2 = find_value_location(lst2, 4) print result2 diff --git a/heap_sort.py b/heap_sort.py index 628088f..7d9b604 100644 --- a/heap_sort.py +++ b/heap_sort.py @@ -1,13 +1,15 @@ #! /usr/bin/evn python -#coding:utf-8 +# coding:utf-8 from heapq import * + def heapsort(iterable): h = [] for value in iterable: - heappush(h,value) + heappush(h, value) return [heappop(h) for i in range(len(h))] -if __name__=="__main__": - print heapsort([1,3,5,9,2]) + +if __name__ == "__main__": + print heapsort([1, 3, 5, 9, 2]) diff --git a/int_divide.py b/int_divide.py index 288c907..7f96895 100644 --- a/int_divide.py +++ b/int_divide.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#encoding:utf-8 +# encoding:utf-8 """ 将一个整数,分拆为若干整数的和。例如实现: @@ -9,20 +9,21 @@ 4=1+1+1+1 """ -def divide(m,r,out): - if(r==0): - return True - m1=r - while m1>0: - if(m1<=m): + +def divide(m, r, out): + if (r == 0): + return True + m1 = r + while m1 > 0: + if (m1 <= m): out.append(m1) - if(divide(m1,r-m1,out)): + if (divide(m1, r - m1, out)): print out out.pop() - m1-=1 + m1 -= 1 return False -n=6 -out=[] -divide(n-1,n,out) +n = 6 +out = [] +divide(n - 1, n, out) diff --git a/int_divide2.py b/int_divide2.py index 01ac93a..8f0135f 100644 --- a/int_divide2.py +++ b/int_divide2.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#encoding:utf-8 +# encoding:utf-8 """ 给你一个小于50的数字 a ,请写出一个算法得到所有可能的数字集合,每个数字集合满足以下条件: @@ -21,25 +21,24 @@ 8->{[8], [6, 2], [5, 3], [4, 4], [4, 2, 2], [3, 3, 2], [2, 2, 2, 2]} """ -def divide(m,r,out): + +def divide(m, r, out): temp = [] out - if(r==0): - return True - m1=r - while m1>1: - if(m1<=m): + if (r == 0): + return True + m1 = r + while m1 > 1: + if (m1 <= m): out.append(m1) - if(divide(m1,r-m1,out)): + if (divide(m1, r - m1, out)): print temp out.pop() - m1-=1 + m1 -= 1 return False -n=6 -out=[] -divide(n-1,n,out) - - +n = 6 +out = [] +divide(n - 1, n, out) diff --git a/is_prime.py b/is_prime.py index 57e4ccf..a609d13 100644 --- a/is_prime.py +++ b/is_prime.py @@ -1,40 +1,44 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 判断一个数是否为素数的几种方法 """ -#方法一 +# 方法一 -import math - -def isPrime1(n): - if n <= 1: - return False - for i in range(2, int(math.sqrt(n)) + 1): - if n % i == 0: +import math + + +def isPrime1(n): + if n <= 1: + return False + for i in range(2, int(math.sqrt(n)) + 1): + if n % i == 0: return False - + return True -#方法二 + +# 方法二 def isPrime2(n): if n <= 1: return False - + i = 2 - while i*i <= n: + while i * i <= n: if n % i == 0: return False i += 1 return True -#方法三 + +# 方法三 from itertools import count + def isPrime3(n): if n <= 1: return False @@ -44,7 +48,8 @@ def isPrime3(n): if n % i == 0: return Fals -#方法四 + +# 方法四 def isPrime4(n): if n <= 1: @@ -61,6 +66,6 @@ def isPrime4(n): return True -if __name__=="__main__": - a=isPrime4(5) +if __name__ == "__main__": + a = isPrime4(5) print a diff --git a/joint_int.py b/joint_int.py index 0aec5b5..114673c 100644 --- a/joint_int.py +++ b/joint_int.py @@ -1,5 +1,5 @@ #! /user/bin/env python -#coding:utf-8 +# coding:utf-8 """ 把一个int型数组中的数字拼成一个串,这个串代表的数字最小; @@ -20,13 +20,13 @@ 4、将list2中的数字(str类型)组装成一个数值(str类型) """ + def joint_int(lst): str_list = [str(i) for i in lst] str_lonely = [str_list[i][j] for i in range(len(str_list)) for j in range(len(str_list[i]))] - + sorted_str = sorted(str_lonely) return "".join(sorted_str) -print joint_int([1230975,4087644567856]) - +print joint_int([1230975, 4087644567856]) diff --git a/kruskal_algorithm.py b/kruskal_algorithm.py index 1061547..2444aca 100644 --- a/kruskal_algorithm.py +++ b/kruskal_algorithm.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 最小生成树的Kruskal算法 @@ -9,30 +9,33 @@ """ -#以全局变量X定义节点集合,即类似{'A':'A','B':'B','C':'C','D':'D'},如果A、B两点联通,则会更改为{'A':'B','B':'B",...},即任何两点联通之后,两点的值value将相同。 +# 以全局变量X定义节点集合,即类似{'A':'A','B':'B','C':'C','D':'D'},如果A、B两点联通,则会更改为{'A':'B','B':'B",...},即任何两点联通之后,两点的值value将相同。 -X = dict() +X = dict() -#各点的初始等级均为0,如果被做为连接的的末端,则增加1 +# 各点的初始等级均为0,如果被做为连接的的末端,则增加1 R = dict() -#设置X R的初始值 + +# 设置X R的初始值 def make_set(point): X[point] = point R[point] = 0 -#节点的联通分量 + +# 节点的联通分量 def find(point): if X[point] != point: X[point] = find(X[point]) return X[point] -#连接两个分量(节点) -def merge(point1,point2): +# 连接两个分量(节点) + +def merge(point1, point2): r1 = find(point1) r2 = find(point2) if r1 != r2: @@ -42,16 +45,17 @@ def merge(point1,point2): X[r1] = r2 if R[r1] == R[r2]: R[r2] += 1 -#KRUSKAL算法实现 + +# KRUSKAL算法实现 def kruskal(graph): for vertice in graph['vertices']: make_set(vertice) minu_tree = set() - + edges = list(graph['edges']) - edges.sort() #按照边长从小到达排序 + edges.sort() # 按照边长从小到达排序 for edge in edges: weight, vertice1, vertice2 = edge if find(vertice1) != find(vertice2): @@ -60,8 +64,7 @@ def kruskal(graph): return minu_tree -if __name__=="__main__": - +if __name__ == "__main__": graph = { 'vertices': ['A', 'B', 'C', 'D', 'E', 'F'], 'edges': set([ @@ -71,8 +74,8 @@ def kruskal(graph): (4, 'B', 'C'), (2, 'B', 'D'), (1, 'C', 'D'), - ]) - } + ]) + } result = kruskal(graph) print result diff --git a/kruskal_algorithm2.py b/kruskal_algorithm2.py index 57c1dda..92aea15 100644 --- a/kruskal_algorithm2.py +++ b/kruskal_algorithm2.py @@ -1,9 +1,10 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 以下代码参考http://www.ics.uci.edu/~eppstein/PADS/的源码 """ + class UnionFind: """ UnionFind的实例: @@ -46,7 +47,7 @@ def __getitem__(self, object): for ancestor in path: self.parents[ancestor] = root return root - + def __iter__(self): """Iterate through all items ever found or unioned by this structure.""" return iter(self.parents) @@ -54,7 +55,7 @@ def __iter__(self): def union(self, *objects): """Find the sets containing the objects and merge them all.""" roots = [self[x] for x in objects] - heaviest = max([(self.weights[r],r) for r in roots])[1] + heaviest = max([(self.weights[r], r) for r in roots])[1] for r in roots: if r != heaviest: self.weights[heaviest] += self.weights[r] @@ -70,6 +71,7 @@ def union(self, *objects): D. Eppstein, April 2004. """ + def isUndirected(G): """Check that G represents a simple undirected graph.""" for v in G: @@ -86,7 +88,7 @@ def union(*graphs): out = {} for G in graphs: for v in G: - out.setdefault(v,set()).update(list(G[v])) + out.setdefault(v, set()).update(list(G[v])) return out @@ -97,6 +99,7 @@ def union(*graphs): import unittest + def MinimumSpanningTree(G): """ Return the minimum spanning tree of an undirected graph G. @@ -118,11 +121,11 @@ def MinimumSpanningTree(G): # part (the sort) is sped up by being built in to Python. subtrees = UnionFind() tree = [] - for W,u,v in sorted((G[u][v],u,v) for u in G for v in G[u]): + for W, u, v in sorted((G[u][v], u, v) for u in G for v in G[u]): if subtrees[u] != subtrees[v]: - tree.append((u,v)) - subtrees.union(u,v) - return tree + tree.append((u, v)) + subtrees.union(u, v) + return tree # If run standalone, perform unit tests @@ -130,11 +133,12 @@ def MinimumSpanningTree(G): class MSTTest(unittest.TestCase): def testMST(self): """Check that MinimumSpanningTree returns the correct answer.""" - G = {0:{1:11,2:13,3:12},1:{0:11,3:14},2:{0:13,3:10},3:{0:12,1:14,2:10}} - T = [(2,3),(0,1),(0,3)] - for e,f in zip(MinimumSpanningTree(G),T): - self.assertEqual(min(e),min(f)) - self.assertEqual(max(e),max(f)) + G = {0: {1: 11, 2: 13, 3: 12}, 1: {0: 11, 3: 14}, 2: {0: 13, 3: 10}, 3: {0: 12, 1: 14, 2: 10}} + T = [(2, 3), (0, 1), (0, 3)] + for e, f in zip(MinimumSpanningTree(G), T): + self.assertEqual(min(e), min(f)) + self.assertEqual(max(e), max(f)) + if __name__ == "__main__": - unittest.main() + unittest.main() diff --git a/longest_increasing_sequence.py b/longest_increasing_sequence.py index a1d3938..59656db 100644 --- a/longest_increasing_sequence.py +++ b/longest_increasing_sequence.py @@ -1,31 +1,33 @@ #!/usr/bin/python -#coding: utf-8 +# coding: utf-8 def isBiggerCompare(a, b): - return a > b + return a > b + + +def findLIS(sequence, compare=isBiggerCompare): + n = len(sequence) + dp = [0 for i in range(n)] + track = [-1 for i in range(n)] + ans = 1 + for i in range(1, n): + MAX = 0 + for j in range(i): + if compare(sequence[i], sequence[j]) and MAX < dp[j]: + MAX = dp[j] + track[i] = j + # track[i] sequence[i]作为最长上升序列末项的前一项 + dp[i] = MAX + 1 + # dp[i] 以sequence[i]结尾的最长上升序列长度 + if dp[i] > dp[ans]: + ans = i + ansList = [sequence[ans]] + while track[ans] != -1: + ans = track[ans] + ansList.insert(0, sequence[ans]) + return ansList -def findLIS(sequence, compare = isBiggerCompare): - n = len(sequence) - dp = [0 for i in range(n)] - track = [-1 for i in range(n)] - ans = 1 - for i in range(1, n): - MAX = 0 - for j in range(i): - if compare(sequence[i], sequence[j]) and MAX < dp[j]: - MAX = dp[j] - track[i] = j - # track[i] sequence[i]作为最长上升序列末项的前一项 - dp[i] = MAX + 1 - # dp[i] 以sequence[i]结尾的最长上升序列长度 - if dp[i] > dp[ans]: - ans = i - ansList = [sequence[ans]] - while track[ans] != -1: - ans = track[ans] - ansList.insert(0, sequence[ans]) - return ansList if __name__ == '__main__': - s = [3, 1, 2, 1, 4, 3, 5] - print findLIS(s) + s = [3, 1, 2, 1, 4, 3, 5] + print findLIS(s) diff --git a/max_sum.py b/max_sum.py index f330f35..e402c9b 100644 --- a/max_sum.py +++ b/max_sum.py @@ -1,4 +1,4 @@ -#coding:utf-8 +# coding:utf-8 def max_array(lst): """面试题:最大连续子数组,求一个有正,有负数的数组(有正和负数,没有全是负数的情况), @@ -17,5 +17,6 @@ def max_array(lst): this_sum = 0 return max_sum -test_lst = [-2,11,-4,13,-5,-2] + +test_lst = [-2, 11, -4, 13, -5, -2] print(max_array(test_lst)) diff --git a/merge_sort.py b/merge_sort.py index 6da7b9e..ce14ade 100644 --- a/merge_sort.py +++ b/merge_sort.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ #solve 1 @@ -60,21 +60,23 @@ def merge(left, right): right = merge_sort(lst[middle:]) return merge(left, right) """ -#solve 3 -#以下方法来自:http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python -#稍作修改 +# solve 3 +# 以下方法来自:http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python +# 稍作修改 from heapq import merge - + + def merge_sort(seq): if len(seq) <= 1: return seq else: - middle = len(seq)/2 + middle = len(seq) / 2 left = merge_sort(seq[:middle]) right = merge_sort(seq[middle:]) - return list(merge(left,right)) + return list(merge(left, right)) + -if __name__=="__main__": - seq = [1,3,6,2,4] +if __name__ == "__main__": + seq = [1, 3, 6, 2, 4] print merge_sort(seq) diff --git a/most_char_num.py b/most_char_num.py index e321645..dbeed63 100644 --- a/most_char_num.py +++ b/most_char_num.py @@ -1,24 +1,26 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -#问题: +# 问题: -#查找字符串中出现最多的字符和个数? +# 查找字符串中出现最多的字符和个数? -#如 sdsdsddssssssdd -> 字符最多的是s,出现9次 +# 如 sdsdsddssssssdd -> 字符最多的是s,出现9次 import collections + def most_character_number(one_string): - static_result = collections.Counter(one_string) #统计字母及其数量,返回类似Counter({'a': 3, 'b': 3, 'c': 1})形式结果 - result = dict(static_result) #转化为dict类型 - most_number = max([value for value in result.values()]) #通过循环,找出dict的值中最大数 - most_character = [key for key,value in result.items() if value==most_number] #找出最大数对应的key - return (most_number,most_character) + static_result = collections.Counter(one_string) # 统计字母及其数量,返回类似Counter({'a': 3, 'b': 3, 'c': 1})形式结果 + result = dict(static_result) # 转化为dict类型 + most_number = max([value for value in result.values()]) # 通过循环,找出dict的值中最大数 + most_character = [key for key, value in result.items() if value == most_number] # 找出最大数对应的key + return (most_number, most_character) + if __name__ == "__main__": - (most_num,most_char) = most_character_number("yyyyyyddddddkuuuiii") - print ("The most character is:%s"%most_num) + (most_num, most_char) = most_character_number("yyyyyyddddddkuuuiii") + print ("The most character is:%s" % most_num) print ("The number is:") for char in most_char: print char diff --git a/most_char_num2.py b/most_char_num2.py index f617837..1d0b9e4 100644 --- a/most_char_num2.py +++ b/most_char_num2.py @@ -1,18 +1,20 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 str1 = "jjjjjjddddddllooppxx" - + + def most_character_number(one_string): """利用字典key来统计次数""" str_dict = {} for item in one_string: if item in str_dict: - str_dict[item] +=1 + str_dict[item] += 1 else: - str_dict[item] =1 - - str_dict = {str_dict[key]:key for key in str_dict} - return (max(str_dict),str_dict[max(str_dict)]) + str_dict[item] = 1 + + str_dict = {str_dict[key]: key for key in str_dict} + return (max(str_dict), str_dict[max(str_dict)]) + print (most_character_number(str1)) diff --git a/operate_int_list.py b/operate_int_list.py index 92dd444..6da0c3a 100644 --- a/operate_int_list.py +++ b/operate_int_list.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题描述: @@ -8,30 +8,33 @@ 然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。 """ -from __future__ import division #实现精确的除法,例如4/3=1.333333 +from __future__ import division # 实现精确的除法,例如4/3=1.333333 import random -def add(x,y): - return x+y + +def add(x, y): + return x + y + def operate_int_list(): - int_list = [random.randint(1,100) for i in range(10)] #在1,100范围内,随机选择10个整数组成一个list + int_list = [random.randint(1, 100) for i in range(10)] # 在1,100范围内,随机选择10个整数组成一个list max_num = max(int_list) min_num = min(int_list) - sum_num = reduce(add,int_list) #这里使用了reduce函数,也可以使用for循环,如下所示 + sum_num = reduce(add, int_list) # 这里使用了reduce函数,也可以使用for循环,如下所示 """ sum_num = 0 for i in int_list: sum_num = sum_num+i """ - ave_num = sum_num/len(int_list) + ave_num = sum_num / len(int_list) + + return (int_list, max_num, min_num, sum_num, ave_num) - return (int_list,max_num,min_num,sum_num,ave_num) -if __name__=="__main__": - int_list,max_num,min_num,sum_num,ave_num = operate_int_list() - print "the int list is:",int_list - print "max number is:",max_num - print "min number is:",min_num - print "the sum of all int in the list:",sum_num - print "the average of the sum:",ave_num +if __name__ == "__main__": + int_list, max_num, min_num, sum_num, ave_num = operate_int_list() + print "the int list is:", int_list + print "max number is:", max_num + print "min number is:", min_num + print "the sum of all int in the list:", sum_num + print "the average of the sum:", ave_num diff --git a/perfect_number.py b/perfect_number.py index d564287..75e7913 100644 --- a/perfect_number.py +++ b/perfect_number.py @@ -1,22 +1,24 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 找出完全数 """ -#找出一个数的因数 + +# 找出一个数的因数 def factors(n): - #return [i for i in range(1,n/2+1) if n%i == 0] - #如果仅仅是为了得到因数,可以用上面的 - #如果是配合下面完全数,最好使用下面的。因为在下面少循环一次,1肯定是任何整数的因数 - return [i for i in range(2,n/2+1) if n%i == 0] + # return [i for i in range(1,n/2+1) if n%i == 0] + # 如果仅仅是为了得到因数,可以用上面的 + # 如果是配合下面完全数,最好使用下面的。因为在下面少循环一次,1肯定是任何整数的因数 + return [i for i in range(2, n / 2 + 1) if n % i == 0] + -#找出某个数n以内的所有完全数,即在[1,n]内(含n) +# 找出某个数n以内的所有完全数,即在[1,n]内(含n) def perfect(n): - #从上面的factors中得到的因数列表中,少1,因此在求因数和的时候,要把1加上。 - return [i for i in range(2,n+1) if (sum(factors(i))+1)==i] + # 从上面的factors中得到的因数列表中,少1,因此在求因数和的时候,要把1加上。 + return [i for i in range(2, n + 1) if (sum(factors(i)) + 1) == i] -if __name__=="__main__": - print perfect(30) +if __name__ == "__main__": + print perfect(30) diff --git a/prim_algorithm.py b/prim_algorithm.py index e26089d..d8d2775 100644 --- a/prim_algorithm.py +++ b/prim_algorithm.py @@ -1,44 +1,44 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 from collections import defaultdict from heapq import * -def prim( vertexs, edges ): +def prim(vertexs, edges): adjacent_vertex = defaultdict(list) - for v1,v2,length in edges: + for v1, v2, length in edges: adjacent_vertex[v1].append((length, v1, v2)) adjacent_vertex[v2].append((length, v2, v1)) mst = [] - chosed = set(vertexs[0]) + chosed = set(vertexs[0]) + + adjacent_vertexs_edges = adjacent_vertex[vertexs[0]] - adjacent_vertexs_edges = adjacent_vertex[vertexs[0]] - heapify(adjacent_vertexs_edges) while adjacent_vertexs_edges: - w, v1, v2 = heappop(adjacent_vertexs_edges) + w, v1, v2 = heappop(adjacent_vertexs_edges) if v2 not in chosed: - chosed.add(v2) - mst.append((v1,v2,w)) - for next_vertex in adjacent_vertex[v2]: + chosed.add(v2) + mst.append((v1, v2, w)) + for next_vertex in adjacent_vertex[v2]: if next_vertex[2] not in chosed: - heappush( adjacent_vertexs_edges,next_vertex) + heappush(adjacent_vertexs_edges, next_vertex) return mst -#test +# test vertexs = list("ABCDEFG") -edges = [ ("A", "B", 7), ("A", "D", 5), - ("B", "C", 8), ("B", "D", 9), - ("B", "E", 7), ("C", "E", 5), - ("D", "E", 15), ("D", "F", 6), - ("E", "F", 8), ("E", "G", 9), - ("F", "G", 11)] - -print "edges:",edges -print "prim:", prim( vertexs, edges ) +edges = [("A", "B", 7), ("A", "D", 5), + ("B", "C", 8), ("B", "D", 9), + ("B", "E", 7), ("C", "E", 5), + ("D", "E", 15), ("D", "F", 6), + ("E", "F", 8), ("E", "G", 9), + ("F", "G", 11)] + +print "edges:", edges +print "prim:", prim(vertexs, edges) diff --git a/quick_sort.py b/quick_sort.py index 83f3b68..cc9dd38 100644 --- a/quick_sort.py +++ b/quick_sort.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题:快速排序 @@ -34,7 +34,8 @@ 因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。 """ -#方法1 + +# 方法1 def quickSort(arr): less = [] @@ -43,7 +44,7 @@ def quickSort(arr): if len(arr) <= 1: return arr else: - pivot = arr[0] #将第一个值做为基准 + pivot = arr[0] # 将第一个值做为基准 for i in arr: if i < pivot: less.append(i) @@ -52,11 +53,12 @@ def quickSort(arr): else: pivotList.append(i) - less = quickSort(less) #得到第一轮分组之后,继续将分组进行下去。 + less = quickSort(less) # 得到第一轮分组之后,继续将分组进行下去。 more = quickSort(more) return less + pivotList + more + """ #方法2 #将方法1写的更紧凑,彰显python特点 @@ -79,23 +81,25 @@ def qsort(list): return qsort(less) + [pivot] + qsort(more) """ -#方法4 +# 方法4 from random import * + def qSort(a): if len(a) <= 1: return a else: - q = choice(a) #基准的选择不同于前,是从数组中任意选择一个值做为基准 + q = choice(a) # 基准的选择不同于前,是从数组中任意选择一个值做为基准 return qSort([elem for elem in a if elem < q]) + [q] * a.count(q) + qSort([elem for elem in a if elem > q]) -#方法5 -#这个最狠了,一句话搞定快速排序,瞠目结舌吧。 +# 方法5 +# 这个最狠了,一句话搞定快速排序,瞠目结舌吧。 -qs = lambda xs : ( (len(xs) <= 1 and [xs]) or [ qs( [x for x in xs[1:] if x < xs[0]] ) + [xs[0]] + qs( [x for x in xs[1:] if x >= xs[0]] ) ] )[0] +qs = lambda xs: \ +((len(xs) <= 1 and [xs]) or [qs([x for x in xs[1:] if x < xs[0]]) + [xs[0]] + qs([x for x in xs[1:] if x >= xs[0]])])[0] -if __name__=="__main__": +if __name__ == "__main__": a = [4, 65, 2, -31, 0, 99, 83, 782, 1] print quickSort(a) print qSort(a) diff --git a/random_list.py b/random_list.py index eedf576..10ba3bf 100644 --- a/random_list.py +++ b/random_list.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 问题 @@ -9,12 +9,11 @@ """ import random -if __name__=="__main__": - a = [random.randint(1000,9999) for i in range(101)] - a_remainder = [i%10 for i in a] + +if __name__ == "__main__": + a = [random.randint(1000, 9999) for i in range(101)] + a_remainder = [i % 10 for i in a] b = [a_remainder.count(i) for i in range(10)] print a print a_remainder print b - - diff --git a/same_element_in_list.py b/same_element_in_list.py index 5bb987d..682fb4c 100644 --- a/same_element_in_list.py +++ b/same_element_in_list.py @@ -1,29 +1,34 @@ #!/usr/bin/env python -#coding:utf-8 +# coding:utf-8 """ 统计一个一维数组中的各个元素的个数,然后删除多出来的重复元素,并输出结果。 例如:[1,2,2,2,3,3,3,3,3]-->[1,2,3] """ + def count_element(one_list): element_number = {} for e in one_list: - number = one_list.count(e) #数出某个元素的个数 - element_number[e] = number #生成类似:{1:1,2:3,3:5}的结果,key-element,value-元素的个数 + number = one_list.count(e) # 数出某个元素的个数 + element_number[e] = number # 生成类似:{1:1,2:3,3:5}的结果,key-element,value-元素的个数 return element_number -#函数count_element(one_list)的功能,可以用collections模块中的Counter完成 + +# 函数count_element(one_list)的功能,可以用collections模块中的Counter完成 from collections import Counter + def count_element2(one_list): return Counter(one_list) -def no_repeat_element(element_number): #element_number是count_element(one_list)的返回值 + +def no_repeat_element(element_number): # element_number是count_element(one_list)的返回值 no_repeat_list = [key for key in element_number] return no_repeat_list + """ 另外一种删除重复元素方法 @@ -32,11 +37,9 @@ def no_repeat_element(element_number): #element_number是count_element(one_ """ - -if __name__=="__main__": - - ls = ["a","a","b","b",'b','c','c'] - el_num=count_element(ls) +if __name__ == "__main__": + ls = ["a", "a", "b", "b", 'b', 'c', 'c'] + el_num = count_element(ls) print el_num no_repeat = no_repeat_element(el_num) print no_repeat @@ -44,7 +47,7 @@ def no_repeat_element(element_number): #element_number是count_element(one_ no_repeat2 = list(set(ls)) print no_repeat2 print "-------" - el_num2=count_element2(ls) + el_num2 = count_element2(ls) print el_num2 no_repeat = no_repeat_element(el_num) print no_repeat diff --git a/sort_chared.py b/sort_chared.py index cac4574..8859788 100644 --- a/sort_chared.py +++ b/sort_chared.py @@ -1,33 +1,31 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -def char_to_number(by_list,char): #根据排序依据字母顺序,给另外一个字母编号 +def char_to_number(by_list, char): # 根据排序依据字母顺序,给另外一个字母编号 try: return by_list.index(char) except: return 1000 -def sort_by_list(by_list,input_list): - result={} +def sort_by_list(by_list, input_list): + result = {} for word in input_list: - number_list = [char_to_number(by_list,word[i]) for i in range(len(word))] - - #得到形如:{"good":[2,3,3,1],"book":[1,3,3,0]}样式的结果 + number_list = [char_to_number(by_list, word[i]) for i in range(len(word))] + + # 得到形如:{"good":[2,3,3,1],"book":[1,3,3,0]}样式的结果 result[word] = number_list - - #将得到的result生成[(key1,value1),(key2,value2),...]列表,按照value值排序,取出排序结果中的key即v[0],生产列表。 - return [v[0] for v in sorted(result.items(),lambda x,y:cmp(x[1],y[1]))] -if __name__=="__main__": - word = ["bed","dog","dear","eye"] - by_string = ['d','g','e','c','f','b','o','a'] + # 将得到的result生成[(key1,value1),(key2,value2),...]列表,按照value值排序,取出排序结果中的key即v[0],生产列表。 + return [v[0] for v in sorted(result.items(), lambda x, y: cmp(x[1], y[1]))] + + +if __name__ == "__main__": + word = ["bed", "dog", "dear", "eye"] + by_string = ['d', 'g', 'e', 'c', 'f', 'b', 'o', 'a'] print "the word list is:" print word print "\nwill sorted by:" print by_string print "\nthe result is:" - print sort_by_list(by_string,word) - - - + print sort_by_list(by_string, word) diff --git a/string_to_hump.py b/string_to_hump.py index 0f9e364..a168d97 100644 --- a/string_to_hump.py +++ b/string_to_hump.py @@ -1,21 +1,22 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -def convert(one_string,space_character): #one_string:输入的字符串;space_character:字符串的间隔符,以其做为分隔标志 +def convert(one_string, space_character): # one_string:输入的字符串;space_character:字符串的间隔符,以其做为分隔标志 - string_list = str(one_string).split(space_character) #将字符串转化为list + string_list = str(one_string).split(space_character) # 将字符串转化为list first = string_list[0].lower() - others = string_list[1:] + others = string_list[1:] - others_capital = [word.capitalize() for word in others] #str.capitalize():将字符串的首字母转化为大写 + others_capital = [word.capitalize() for word in others] # str.capitalize():将字符串的首字母转化为大写 others_capital[0:0] = [first] - hump_string = ''.join(others_capital) #将list组合成为字符串,中间无连接符。 + hump_string = ''.join(others_capital) # 将list组合成为字符串,中间无连接符。 return hump_string -if __name__=='__main__': + +if __name__ == '__main__': print "the string is:ab-cd-ef" print "convert to hump:" - print convert("ab-cd-ef","-") + print convert("ab-cd-ef", "-") diff --git a/sudoku.py b/sudoku.py index 43c89c8..b8bae91 100644 --- a/sudoku.py +++ b/sudoku.py @@ -1,15 +1,16 @@ #! /usr/bin/env python -#coding:utf-8 +# coding:utf-8 -#判断输入的九宫格的格数是否为奇数 +# 判断输入的九宫格的格数是否为奇数 def if_odd(n): - if n%2==1: + if n % 2 == 1: return True else: return False -#九宫格填写数的法则 + +# 九宫格填写数的法则 """ 按照下面的方式排列 -------------->x(从1到n) @@ -30,33 +31,31 @@ def if_odd(n): (4)如果“右”“上”位置都超过边界,即x+1>n,y-1=n: #条件(4) - tx = tx-1 - ty = ty+2 - elif ty<0: #(3) - ty = n-1 - elif tx>=n: #(2) + for i in range(n * n): + sudoku[ty][tx] = i + 1 + tx = tx + 1 + ty = ty - 1 + if ty < 0 and tx >= n: # 条件(4) + tx = tx - 1 + ty = ty + 2 + elif ty < 0: # (3) + ty = n - 1 + elif tx >= n: # (2) tx = 0 - elif sudoku[ty][tx]!=0: #(5) - tx = tx-1 - ty = ty+2 + elif sudoku[ty][tx] != 0: # (5) + tx = tx - 1 + ty = ty + 2 return sudoku -if __name__=="__main__": - n = 5 + +if __name__ == "__main__": + n = 5 sudoku = [[0 for i in range(n)] for i in range(n)] - s = sudoku_rule(n,sudoku) + s = sudoku_rule(n, sudoku) for line in s: print line - - - -