Domanda

Sto cercando di visualizzare tutte le possibili permutazioni di un elenco di numeri, ad esempio se ho 334 voglio ottenere:

3 3 4
3 4 3
4 3 3

Devo essere in grado di farlo per qualsiasi serie di cifre lunga fino a circa 12 cifre.

Sono sicuro che probabilmente è abbastanza semplice usare qualcosa come itertools.combinations ma non riesco a ottenere la sintassi corretta.

TIA Sam

È stato utile?

Soluzione

>>> lst = [3, 3, 4]
>>> import itertools
>>> set(itertools.permutations(lst))
{(3, 4, 3), (3, 3, 4), (4, 3, 3)}

Altri suggerimenti

senza itertools

def permute(LIST):
    length=len(LIST)
    if length <= 1:
        yield LIST
    else:
        for n in range(0,length):
             for end in permute( LIST[:n] + LIST[n+1:] ):
                 yield [ LIST[n] ] + end

for x in permute(["3","3","4"]):
    print x

produzione

$ ./python.py
['3', '3', '4']
['3', '4', '3']
['3', '3', '4']
['3', '4', '3']
['4', '3', '3']
['4', '3', '3']

Si vuole permutazioni, non combinazioni. Vedere: Come generare tutte le permutazioni di una lista in Python

>>> from itertools import permutations
>>> [a for a in permutations([3,3,4])]
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)]

Si noti che è permutando la due 3 (che è la cosa giusta da fare matematicamente), ma non è lo stesso del vostro esempio. Questo farà solo una differenza se ci sono i numeri duplicati nella vostra lista.

userei itertools di pitone, ma se si dovesse implementare da soli, ecco il codice che restituisce tutte le permutazioni di una dimensione specificata per un elenco di valori.

Esempio: values = [1,2,3], size = 2 => [[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]

def permutate(values, size):
  return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size))

def permutate_positions(n, size):
  if (n==1):
    return [[n]]

  unique = []
  for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]):
    if p not in unique:
      unique.append(p)

  return unique
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top