2014-03-12 36 views
3

添加元素可以说我有一个元组像下面:在一个元组

s = 15, 50, 71, 4, 19 

,我试图在元组逐一互相元素添加每个元素。即找到15和50,15和71等的总和...

所以我试图搞砸地图功能,但我从来没有使用过它,但我已经拿出这个,但我得到TypeError:map()的参数2必须支持迭代错误。

test1 = tuple(map(operator.add, s[0], s[1])) 

我也试图让每个元素的整数,但我也得到一个错误

test1 = tuple(map(operator.add, int(s[0]), int(s[1]))) 

我希望另一种方法有人知道我能做到什么,我试图做的。

谢谢!

编辑:

谢谢大家,所有的建议都是有益的,我发现了一些不同的方式做什么,我需要做!

+1

你期望的输出成为你的榜样? – interjay

+0

和你有没有关心,如果有重复? –

+0

为了最终结果,可以说我正在寻找2的数字等于65的总和,所以我试图找出哪两个数字的组合将等于那个数字 – Neemaximo

回答

5

我想也许你正在寻找itertools.combinationsitertools.starmap

In [7]: s = 15, 50, 71, 4, 19 

In [8]: import itertools as IT 

In [9]: import operator 

In [10]: list(IT.starmap(operator.add, (IT.combinations(s, 2)))) 
Out[10]: [65, 86, 19, 34, 121, 54, 69, 75, 90, 23] 

IT.combinations(s, 2)返回从s与所有对项目的迭代器:

In [11]: list(IT.combinations(s, 2)) 
Out[11]: 
[(15, 50), 
(15, 71), 
(15, 4), 
(15, 19), 
(50, 71), 
(50, 4), 
(50, 19), 
(71, 4), 
(71, 19), 
(4, 19)] 

IT.starmap适用operator.add每个对。如果希望参数解压缩,则使用starmap而不是mapoperator.add需要2个参数,而这个对只是一个单一的对象 - 一个2元组。因此,我们使用starmap将2元组解包为2个参数,然后将它们传递给operator.add

+0

谢谢,这就是我一直在寻找的! – Neemaximo

0

这是我做过的最粗糙的事情。 不需要输入任何东西虽然

>>> s = 15, 50, 71, 4, 19 
>>> s 
(15, 50, 71, 4, 19) 
>>> x = [a + s[i-1] for a in s[i:] for i in range(1,len(s)) for a in s[i:]] 
>>> x 
[65, 86, 19, 34, 121, 54, 69, 75, 90, 23] 
3

这似乎简单,只需使用sum ...

starmap(operator.add ...)是一回事map(sum ...)

tuple(map(sum, itertools.combinations(s, 2))) 
Out[9]: (65, 86, 19, 34, 121, 54, 69, 75, 90, 23) 
0

我通常用列表解析法的地图......你更喜欢哪一个,似乎是风格化的。该方法是这样的:

tuple(x+y for x,y in combinations(s, 2)) 

它也比地图快一些,但我不是100%确定为什么。

1

如果你不想使用combinations() -

s = 15, 50, 71, 4, 19 
l = len(s) 
print [s[i] + s[j] for i in xrange(l - 1) for j in xrange(i + 1, l)] 

# [65, 86, 19, 34, 121, 54, 69, 75, 90, 23]