繁体   English   中英

从对创建一个元组

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

我写的代码有效,但我正在寻找更好的代码
先感谢您

您可以使用itertoolsproductpermutations

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循环结构(你的t1t2变量)产生的元组(两个元素),并且permutations产生由cd变量同等产生的两个排列。

这是一个丑陋的单行。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM