2006年03月07日 星期二 11:26
Permutaion实现时,当selection = 1时是会报错的。 ======= 2006-03-07 08:14:47 您在来信中写道:======= >Python就是爽 > >思路出来,代码只是小case,原本以为要调试一番,结果是白担心了 > >Permutaion用了链表,Combination用来二叉树,不过代码里看不出二叉树。这是设计算法的时候加的辅助线,真正写代码的时候反而用不着了。也挺有意思的。 > >已经给Python Cookbook发邮件了,希望能收录。 > >On 3/5/06, Bruce Wang <number5 at gmail.com> wrote: >> On 3/6/06, shhgs <shhgs.efhilt at gmail.com> wrote: >> > 我有思路了,过两天等有空了写出来 >> > >> > 这段代码是不是够资格贴到cookbook? >> > >> >> 够资格了 :) >> >> 其实那里没什么限制的 >> >> -- >> simple is good >> http://brucewang.net >> >> _______________________________________________ >> python-chinese >> Post: send python-chinese at lists.python.cn >> Subscribe: send subscribe to python-chinese-request at lists.python.cn >> Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn >> Detail Info: http://python.cn/mailman/listinfo/python-chinese >> >> >_______________________________________________ >python-chinese >Post: send python-chinese at lists.python.cn >Subscribe: send subscribe to python-chinese-request at lists.python.cn >Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn >Detail Info: http://python.cn/mailman/listinfo/python-chinese = = = = = = = = = = = = = = = = = = = = -------------- next part -------------- A non-text attachment was scrubbed... Name: wangzhe.vcf Type: text/x-vcard Size: 304 bytes Desc: not available Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20060307/ce20c148/wangzhe.vcf
2006年03月08日 星期三 07:22
已经更正了代码,贴到cookbook上了,具体的算法分析也给了 下面把代码再帖一遍 def CombinationEnumerator(listObj, selection) : class CombEnum(object) : def __init__(self, listObj, selection) : assert selection <= len(listObj) self.items = listObj self.route = ([True, ]*selection) + [False, ]*(len(listObj)-selection) self.selection = selection def value(self) : result = [ val for flag, val in zip(self.route, self.items) if flag ] return result def next(self) : try : while self.route[-1] : self.route.pop() while not self.route[-1] : self.route.pop() except : return False self.route[-1] = False count = self.route.count(True) self.route.extend( (self.selection - count) * [True,] ) padding = len(self.items) - len(self.route) self.route.extend( padding * [False, ]) return True if selection == 0 : yield [] return rotor = CombEnum(listObj, selection) yield rotor.value() while rotor.next() : yield rotor.value() def PermutationEnumerator(choice, selection) : class Rotor(object) : def __init__(self, choice, selection, parent = None) : assert len(choice) >= selection self.selection = selection self.parent = parent self.choice = choice self.cursor = 0 if selection == 1 : self.child = None else : self._spawn_child() def value(self) : if self.child : result = self.child.value() result.append(self.choice[self.cursor]) return result else : return [ self.choice[self.cursor], ] def _spawn_child(self) : assert self.selection >= 2 cursor = self.cursor child_choice = self.choice[:cursor] + self.choice[cursor + 1:] self.child = Rotor(child_choice, self.selection -1, self) def next(self) : result = False if self.child : result = self.child.next() if result : return result else : self.cursor += 1 if self.cursor == len(self.choice) : return False else : if self.child : self._spawn_child() return True rotor = Rotor(choice, selection) yield rotor.value() while rotor.next() : yield rotor.value() if __name__ == "__main__" : items = [ 'a', 'b', 'c'] for algo in (CombinationEnumerator, PermutationEnumerator) : for selection in range(1, 4) : print algo.__name__ print items print selection enum = algo(items, selection) for i in enum : print i print "\n\n\n" On 3/6/06, wangzhe <wangzhe at eastcom.com> wrote: > Permutaion实现时,当selection = 1时是会报错的。 > > ======= 2006-03-07 08:14:47 您在来信中写道:======= > > >Python就是爽 > > > >思路出来,代码只是小case,原本以为要调试一番,结果是白担心了 > > > >Permutaion用了链表,Combination用来二叉树,不过代码里看不出二叉树。这是设计算法的时候加的辅助线,真正写代码的时候反而用不着了。也挺有意思的。 > > > >已经给Python Cookbook发邮件了,希望能收录。 > > > >On 3/5/06, Bruce Wang <number5 at gmail.com> wrote: > >> On 3/6/06, shhgs <shhgs.efhilt at gmail.com> wrote: > >> > 我有思路了,过两天等有空了写出来 > >> > > >> > 这段代码是不是够资格贴到cookbook? > >> > > >> > >> 够资格了 :) > >> > >> 其实那里没什么限制的 > >> > >> -- > >> simple is good > >> http://brucewang.net > >> > >> _______________________________________________ > >> python-chinese > >> Post: send python-chinese at lists.python.cn > >> Subscribe: send subscribe to python-chinese-request at lists.python.cn > >> Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > >> Detail Info: http://python.cn/mailman/listinfo/python-chinese > >> > >> > >_______________________________________________ > >python-chinese > >Post: send python-chinese at lists.python.cn > >Subscribe: send subscribe to python-chinese-request at lists.python.cn > >Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > >Detail Info: http://python.cn/mailman/listinfo/python-chinese > > = = = = = = = = = = = = = = = = = = = = > > > _______________________________________________ > python-chinese > Post: send python-chinese at lists.python.cn > Subscribe: send subscribe to python-chinese-request at lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese > > >
Zeuux © 2025
京ICP备05028076号