python tuples

python - crear una tupla a partir de pares



tuples (9)

Me gustaría crear una tupla que presente todos los pares posibles de dos tuplas

Este es un ejemplo de lo que me gustaría recibir:

first_tuple = (1, 2) second_tuple = (4, 5) mult_tuple(first_tuple, second_tuple)

salida:

((1, 4), (4, 1), (1, 5), (5, 1), (2, 4), (4, 2), (2, 5), (5, 2))

Esto es lo que hice que tuvo éxito, sin embargo, parece un poco engorroso:

def mult_tuple(tuple1, tuple2): ls=[] for t1 in tuple1: for t2 in tuple2: c=(t1,t2) d=(t2,t1) ls.append(c) ls.append(d) return tuple(ls) first_tuple = (1, 2) second_tuple = (4, 5) mult_tuple(first_tuple, second_tuple)

El código que escribí funciona, sin embargo, estoy buscando un código más agradable
gracias de antemano


Aquí hay una frase fea.

first_tuple = (1, 2) second_tuple = (4, 5) tups = [first_tuple, second_tuple] res = [(i, j) for x in tups for y in tups for i in x for j in y if x is not y] # [(1, 4), (1, 5), (2, 4), (2, 5), (4, 1), (4, 2), (5, 1), (5, 2)]

A menos que esté utilizando esto para el deporte, probablemente debería elegir una solución más legible, por ejemplo, una de MrGeek a continuación.


Mi camino en una línea:

[item for sublist in [[(i,j),(j,i)] for i in first_tuple for j in second_tuple] for item in sublist] [(1, 4), (4, 1), (1, 5), (5, 1), (2, 4), (4, 2), (2, 5), (5, 2)]


Puede usar el product y las permutations itertools :

from itertools import product, permutations first_tuple, second_tuple = (1, 2), (4, 5) result = () for tup in product(first_tuple, second_tuple): result += (*permutations(tup),) print(result)

Salida:

((1, 4), (4, 1), (1, 5), (5, 1), (2, 4), (4, 2), (2, 5), (5, 2))

product produce las tuplas (dos elementos) producidas igualmente por la estructura de bucle anidado (sus variables t1 y t2 ), y las permutations producen las dos permutaciones producidas igualmente por sus variables d .


Si desea evitar el uso de la biblioteca estándar ( itertools ), simplemente combine dos comprensiones de lista:

result = [(x, y) for x in first_tuple for y in second_tuple] result.extend( (x, y) for x in second_tuple for y in first_tuple )

luego conviértalo en una tuple si es importante para usted.


También puedes hacer:

from itertools import permutations t1=(1,2) t2=(3,4) my_tuple=tuple([key for key in filter(lambda x: x!=t1 and (x!=t2),list(permutations(t1+t2,2)))])


Una línea usando una comprensión de la lista que no requiere una import .

t1 = (1, 2) t2 = (4, 5) >>> sorted([t for i in t1 for j in t2 for t in ((i, j), (j, i))]) # [(1, 4), (1, 5), (2, 4), (2, 5), (4, 1), (4, 2), (5, 1), (5, 2)]

Por supuesto, para "todos los pares posibles de dos tuplas significa" que tendría como máximo ocho pares de tuplas en el resultado. Puede hacer referencia explícita a ellos, lo que debería ser la solución más rápida si se trata de un código de tiempo crítico (y si no es necesario ordenarlo, será aún más rápido).

>>> sorted(((t1[0], t2[0]), (t1[0], t2[1]), (t1[1], t2[0]), (t1[1], t2[1]), (t2[0], t1[0]), (t2[0], t1[1]), (t2[1], t1[0]), (t2[1], t1[1]))) # [(1, 4), (1, 5), (2, 4), (2, 5), (4, 1), (4, 2), (5, 1), (5, 2)]

Opcional: use set para garantizar que solo se devuelvan pares únicos.

t1 = (1, 2) t2 = (1, 2) >>> sorted([t for i in t1 for j in t2 for t in ((i, j), (j, i))]) # [(1, 1), (1, 1), (1, 2), (1, 2), (2, 1), (2, 1), (2, 2), (2, 2)] >>> sorted(set([t for i in t1 for j in t2 for t in ((i, j), (j, i))])) # [(1, 1), (1, 2), (2, 1), (2, 2)]


itertools.product te da lo que quieres. Sin embargo, dado que el producto cartesiano de dos tuplas no es conmutativo ( product(x,y) != product(y,x) ), debe calcular ambos y concatenar los resultados.

>>> from itertools import chain, product >>> x = (1,4) >>> y = (2, 5) >>> list(chain(product(x,y), product(y,x))) [(1, 2), (1, 5), (4, 2), (4, 5), (2, 1), (2, 4), (5, 1), (5, 4)]

(Puede usar la chain aquí en lugar de las permutations porque solo hay dos permutaciones de una tupla de 2, que son lo suficientemente fáciles de especificar explícitamente).


def mul_tup(tup1, tup2): l=[] for x in tup1: for y in tup2: a=(x,y) b=(y,x) l.append(a) l.append(b) return tuple(l) first_tup= tuple([eval(x) for x in input("enter the values: ").split('','')]) second_tup= tuple([eval(x) for x in input("enter the values: ").split('','')]) q = mult_tup(first_tup, second_tup) print(q)


first_tuple = (1, 2) second_tuple = (4, 5) out = [] for val in first_tuple: for val2 in second_tuple: out.append((val, val2)) out.append((val2, val)) print(tuple(out))

Huellas dactilares:

((1, 4), (4, 1), (1, 5), (5, 1), (2, 4), (4, 2), (2, 5), (5, 2))