在元组中添加元素

时间:2014-03-12 18:32:32

标签: python map tuples

假设我有一个像下面这样的元组:

s = 15, 50, 71, 4, 19

我正在尝试将元组中的每个元素与其他元素逐个添加。即找到15和50以及15和71等的总和......

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

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

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

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

我希望有人知道另一种方法,我可以完成我想要做的事情。

谢谢!

编辑:

谢谢大家,所有建议都很有帮助,我找到了一些不同的方法来做我需要做的事情!

5 个答案:

答案 0 :(得分: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.starmapoperator.add应用于每对。如果希望解压缩参数,可以使用starmap而不是mapoperator.add需要2个参数,而这对只是一个对象 - 一个2元组。因此我们使用starmap将2元组解压缩为2个参数,然后将它们传递给operator.add

答案 1 :(得分: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)

答案 2 :(得分: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]

答案 3 :(得分: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]

答案 4 :(得分:0)

我通常使用列表推导而不是地图...你喜欢哪一个似乎是风格。那种方法是这样的:

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

它也比地图快一些,但我不是百分之百确定原因。