example python string graph combinations permutation

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'']]