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