假设我有一个像下面这样的元组:
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])))
我希望有人知道另一种方法,我可以完成我想要做的事情。
谢谢!
编辑:
谢谢大家,所有建议都很有帮助,我找到了一些不同的方法来做我需要做的事情!
答案 0 :(得分:5)
我想也许您正在寻找itertools.combinations和itertools.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
而不是map
。 operator.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))
它也比地图快一些,但我不是百分之百确定原因。