example - itertools python 3
Combinaciones sin usar "itertools.combinations" (3)
Si no desea utilizar itertools
, utilice el equivalente puro de Python documentado :
def combinations(iterable, r):
# combinations(''ABCD'', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
Lo que necesitaría es crear combinaciones para dos elementos por vez.
si una lista contiene: seq = [''A'', ''B'', ''C''] la salida sería com = [[''A'', ''B''], [''A'', ''C''], [''B '','' C '']]
todo esto sin el método "itertools.combinations".
Estaba acostumbrado a usar este código para las permutaciones. Pero, ¿cómo podría modificar el código para que funcione con las combinaciones?
def permute(seq):
if len(seq) <= 1:
perms = [seq]
else:
perms = []
for i in range(len(seq)):
sub = permute(seq[:i]+seq[i+1:])
for p in sub:
perms.append(seq[i:i+1]+p)
return perms
Esto es trivial de hacer directamente:
def comb2(s):
for i, v1 in enumerate(s):
for j in range(i+1, len(s)):
yield [v1, s[j]]
Entonces:
print list(comb2([''A'', ''B'', ''C'']))
muestra:
[[''A'', ''B''], [''A'', ''C''], [''B'', ''C'']]
Lo único que hace que las combinaciones sean del todo difíciles es atender a un número conocido de elementos de tiempo de ejecución a la vez. Siempre que sepa ese número por adelantado, un número fijo de bucles anidados tan profundo hace el trabajo de una manera obvia.
Una traducción flexible del código recursivo de C ++ en una respuesta a una pregunta similar:
_NULL = type(''_NULL'', (object,), {})() # unique sentinel singleton object
def combinations(sequence, length):
""" Find all combinations of the specified length from a sequence. """
if length <= 0:
combos = [_NULL]
else:
combos = []
for i, item in enumerate(sequence, 1):
rem_items = sequence[i:]
rem_combos = combinations(rem_items, length-1)
combos.extend(item if combo is _NULL else [item, combo]
for combo in rem_combos)
return combos
print( combinations([''A'', ''B'', ''C''], 2) )
Salida:
[[''A'', ''B''], [''A'', ''C''], [''B'', ''C'']]