Создать кортеж из пар

Я хотел бы создать кортеж, представляющий все возможные пары из двух кортежей

это пример того, что я хотел бы получить:

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

вывод:

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

Это то, что я сделал, но все же выглядит немного громоздко:

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)  

Код, который я написал, работает, но я ищу более хороший код
заранее спасибо

Ответ 1

Вот уродливый однострочник.

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

Если вы не используете это для спорта, вам, вероятно, следует выбрать более удобочитаемое решение, например, один от MrGeek ниже.

Ответ 2

Вы можете использовать itertoolsproduct и permutations:

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)

Выход:

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

product создает кортежи (два элемента), созданные в равной степени вложенной структурой цикла (ваши переменные t1 и t2), а permutations создает две перестановки, одинаково созданные вашими c и d переменные.

Ответ 3

itertools.product дает вам то, что вы хотите. Однако, поскольку декартово произведение двух кортежей не является коммутативным (product(x,y) != product(y,x)), вам необходимо вычислить оба и объединить результаты.

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

(Вы можете использовать chain здесь вместо permutations, потому что есть только две перестановки 2-кортежа, которые достаточно просто указать явно.)

Ответ 4

Если вы хотите избежать использования стандартной библиотеки (itertools), просто объедините два списка понимания:

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 )

затем перейдите в tuple, если это важно для вас.

Ответ 5

Также Вы можете сделать:

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

Ответ 6

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))

Печать:

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

Ответ 7

Однострочник, использующий понимание списка, для которого не требуется 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)]

Конечно, для "всех возможных пар из двух кортежей" в результате вы получите не более восьми пар кортежей. Вы могли бы явно ссылаться на них, что должно быть самым быстрым решением, если это критичный ко времени код (и если сортировка не требуется, она будет еще быстрее).

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

Необязательно: используйте set, чтобы гарантировать, что возвращаются только уникальные пары.

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

Ответ 8

Мой путь в одну строку:

[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)]

Ответ 9

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)