Python 创建一个成对的元组

Python 创建一个成对的元组,python,tuples,Python,Tuples,我想创建一个元组,它表示两个元组中所有可能的对 这是我希望收到的示例: 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

我想创建一个元组,它表示两个元组中所有可能的对

这是我希望收到的示例:

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, 4), (4, 1), (1, 5), (5, 1), (2, 4), (4, 2), (2, 5), (5, 2))

product
生成嵌套for循环结构(您的
t1
t2
变量)平均生成的元组(两个元素),而
permutations
生成由
c
d
变量平均生成的两种排列。

如果您想避免使用标准库(
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 )
如果对您很重要,请将其转换为元组。

您还可以执行以下操作:

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

这是一条难看的单行线

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

除非您将其用于体育运动,否则您可能应该使用更具可读性的解决方案,例如下面Geek先生的解决方案。

itertools。产品提供您想要的。但是,由于两个元组的笛卡尔积是不可交换的(
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元组只有两个排列,很容易明确指定。)

印刷品:

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

使用列表理解的一行程序,不需要导入

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

当然,对于“来自两个元组的所有可能的对”来说,结果中最多有八个元组对。您可以显式地引用它们,如果这是时间关键型代码,那么这应该是最快的解决方案(如果不需要排序,则会更快)


可选:使用
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)]
我用一句话来说:

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

<代码>迭代工具。产品会让你走到一半。如果你正在寻找唯一的元组,你可能也想考虑一下。您想同时添加
(1,1)
吗?相反,我认为这个问题更适合您,您也可以将iterables解包,以一种更干净的方式生成最终列表:
[*产品(x,y),*产品(y,x)]
被否决,因为这明确依赖于长度为2的
t1
t2
,否则将产生不正确的输出。
>>> 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)]
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)]
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)
[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)]