[英]create a tuple from pairs
我想创建一个元组,它呈现两个元组中所有可能的对
这是我想要收到的例子:
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)
我写的代码有效,但我正在寻找更好的代码
先感谢您
您可以使用itertools
的product
和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
产生由嵌套for循环结构(你的t1
和t2
变量)产生的元组(两个元素),并且permutations
产生由c
和d
变量同等产生的两个排列。
这是一个丑陋的单行。
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。
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个元组的两个排列,这很容易明确指定。)
如果您想避免使用标准库( itertools
),那么只需组合两个列表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
如果它对你很重要。
你也可以这样做:
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)
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))
使用不需要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)]
我的方式在一行:
[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)]
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.