Path: csiph.com!optima2.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!newsgate.cuhk.edu.hk!news.netfront.net!not-for-mail From: Antonio Valentino Newsgroups: it.comp.lang.python Subject: Re: Contatore in funzione ricorsiva Date: Sat, 17 Oct 2015 17:22:45 +0200 Organization: Netfront http://www.netfront.net/ Lines: 63 Message-ID: References: NNTP-Posting-Host: 151.64.57.173 Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit X-Trace: adenine.netfront.net 1445095366 21050 151.64.57.173 (17 Oct 2015 15:22:46 GMT) X-Complaints-To: news@netfront.net NNTP-Posting-Date: Sat, 17 Oct 2015 15:22:46 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 In-Reply-To: Xref: csiph.com it.comp.lang.python:7598 Ciao Francesco, Il 17/10/2015 13:45, Francesco Di Matteo ha scritto: > Ciao a tutti, > dovrei usare una routine che genera delle permutazioni di elementi in una > lista. > In rete ho trovato questa ricorsiva: > > def perm(n, i): > if i == len(n) - 1: > print n > else: > for j in range(i, len(n)): > n[i], n[j] = n[j], n[i] > perm(n, i + 1) > n[i], n[j] = n[j], n[i] # swap back, for the next loop > > perm([1, 2, 3], 0) > > che č molto efficiente e compatta, ma non riesco a "numerare" le > combinazioni. > In pratica non riesco ad inserire un "contatore" nel ciclo ricorsivo che > enumeri le combinazioni. > Per esempio se voglio un output cosė > 1 1,2,3 > 2 1,3,2 > 3 2,1,3 > ecc.... > > Chi mi potrebbe dare un suggerimento? > > Francesco > esiste una funzione della libreria standard per generare le permutazioni: itertools.permutations. Per enumerare un iterabile si usa solitamente la funzione "enumerate". In sintesi: import itertools for n, i in enumerate(itertools.permutations([1, 2, 3])): print('{} {}'.format(n, i)) dovrebbe fare quello che chiedi. In forma pių sintetica puoi usare anche: print('\n'.join('{} {}'.format(n, i) for n, i in enumerate(itertools.permutations([1, 2, 3])))) ciao -- Antonio Valentino --- news://freenews.netfront.net/ - complaints: news@netfront.net ---