与元组Python联合

时间:2015-05-20 14:47:07

标签: python tuples union

import itertools

list_with_tuples=[(1,), (2,), (3,)]
pairs = itertools.combinations(list_with_tuples, 2)
for pair in pairs:
   print(pair)

所以对的结果是:

 ((1,),(2,)) ,

 ((1,),(3)) ,

 ((2,),(3,))

我如何结合他们? 工会结束后,我想做一本字典:

di={ (1,2): value1, (1,3): value2, (2,3): value3 }

我该怎么做?

4 个答案:

答案 0 :(得分:10)

在python中“联合”元组的一种方法是简单地添加它们:

>>> (1,) + (2,)
(1, 2)

所以你可以修改你的例子来添加:

import itertools

list_with_tuples=[(1,), (2,), (3,)]
pairs = itertools.combinations(list_with_tuples, 2)
for left, right in pairs:
     print(left + right)

输出:

(1, 2)
(1, 3)
(2, 3)

如果您需要添加n个元组,而不仅仅是其中的2个元组,则可以使用sum并指定空元组()的初始值作为第二个参数。

或者,正如Kevin在评论中提到的,您可以通过使用itertools.chain的输出来构建新元组,如果n很大,这可能会更有效。

答案 1 :(得分:0)

您可以使用dict理解为您执行此操作。迭代itertools.combinations,将tuple中的值编入索引,然后创建新的tuple作为键,并将其添加为值。

>>> {(i[0],j[0]) : i[0] + j[0] for i,j in itertools.combinations(list_with_tuples, 2)}
{(1, 2): 3, (1, 3): 4, (2, 3): 5}

答案 2 :(得分:0)

您可以将元素链接到一个元组:

from itertools import chain,combinations
list_with_tuples=[(1,), (2,), (3,)]


di =  {tuple(chain.from_iterable(comb)):"value" for comb in combinations(list_with_tuples, 2)}

print(di)
{(1, 2): 'value', (1, 3): 'value', (2, 3): 'value'}

它适用于任何长度组合。

如果您有另一个容器,其中包含您可以压缩的值:

from itertools import chain,combinations
list_with_tuples=[(1,), (2,), (3,)]

values = [1,2,3]
di = {tuple(chain.from_iterable(comb)): val for comb,val in zip(combinations(list_with_tuples, 2),values)}

print(di)
{(1, 2): 1, (1, 3): 2, (2, 3): 3}

答案 3 :(得分:0)

您可以使用itertools.chain()

将可元组和列表等可迭代对象连接在一起
list_with_tuples=[(1,), (2,), (3,)]
pairs = itertools.combinations(list_with_tuples, 2)
for pair in pairs:
    print(tuple(itertools.chain(*pair)))

这也有一个懒惰的优点,所以你可以一次遍历链一个元素,而不是从中完成一个完整的元组,如果这是你需要的。如果pair也是一个惰性迭代器,您可能希望使用itertools.chain.from_iterable()而不是星号运算符。