una repeticion permutaciones permutacion listado lista generar conjunto con combinaciones combinacion codigo algoritmo python permutation combinatorics

listado - Generando permutaciones con repeticiones en python.



permutaciones sin repeticion python (5)

Lo sé, pero parece que solo puede generar permutaciones sin repeticiones.

por ejemplo, me gustaría generar todas las tiradas de dados posibles para 2 dados. Así que necesito todas las permutaciones de tamaño 2 de [1, 2, 3, 4, 5, 6] incluyendo repeticiones: (1, 1), (1, 2), (2, 1) ... etc

Si es posible no quiero implementar esto desde cero.


Aquí está la versión c # (a pesar de que se solicita para python, el algoritmo debería ser el mismo) solo como referencia:

A continuación el método básicamente toma no. muchas veces se pueden lanzar los dados para obtener varias permutaciones. Para la pregunta anterior, el tamaño debe ser ''2''.

private void GetAllPermutationsOfDice_Recursive(int size, string currentValue, List<string> values) { if(currentValue.Length == size) { values.Add(currentValue); return; } for(int i = 1; i<=6;i++) { this.GetAllPermutationsOfDice_Recursive(size, currentValue + i, values); } }

Para lanzar los dados dos veces, el método anterior se puede llamar como:

public string[] GetAllPermutationsOfDiceOfSize_2() { List<string> values = new List<string>(); this.GetAllPermutationsOfDice_Recursive(2, "", values); return values.ToArray(); }

A continuación se muestran las pruebas unitarias correspondientes:

[TestMethod] public void Dice_PermutationsTests() { var v = this.GetAllPermutationsOfDiceOfSize_2(); Assert.AreEqual(36, v.Length); int l = 6; List<string> values = new List<string>(); for(int i = 1; i<=4; i++) { values.Clear(); this.GetAllPermutationsOfDice_Recursive(i, "", values); Assert.AreEqual(l, values.Count); l *= 6; } }


En Python 2.7 y 3.1 hay una función itertools.combinations_with_replacement :

>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2)) [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), (5, 5), (5, 6), (6, 6)]


No estás buscando permutaciones, quieres el Producto Cartesiano . Para este uso use product de itertools:

from itertools import product for roll in product([1, 2, 3, 4, 5, 6], repeat = 2): print(roll)


Primero, primero querrá convertir el generador devuelto por itertools.permutations (lista) en una lista. Luego, en segundo lugar, puedes usar set () para eliminar duplicados. Algo como a continuación:

def permutate(a_list): import itertools return set(list(itertools.permutations(a_list)))


Usted está buscando el producto cartesiano .

En matemáticas, un producto cartesiano (o conjunto de productos) es el producto directo de dos conjuntos.

En su caso, esto sería {1, 2, 3, 4, 5, 6} x {1, 2, 3, 4, 5, 6} . itertools puede ayudar allí

import itertools x = [1, 2, 3, 4, 5, 6] [p for p in itertools.product(x, repeat=2)] [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]

Para obtener una tirada de dados al azar (de una manera totalmente ineficiente):

import random random.choice([p for p in itertools.product(x, repeat=2)]) (6, 3)