Python – Itertools.starmap()
itertools 是Python中的一个模块,具有一组用于处理迭代器的函数。它们使迭代列表和字符串等可迭代对象变得非常容易。一个这样的 itertools函数是starmap() 。
注意:更多信息请参考Python Itertools
星图()函数
当一个iterable 包含在另一个iterable 中并且必须对其应用某些函数时,使用starmap()。 starmap() 将另一个迭代中的迭代的每个元素视为一个单独的项目。它类似于 map()。此函数属于终止迭代器的类别。
句法 :
starmap(function, iterable)
该函数可以是内置函数,也可以是用户定义的甚至是 lambda函数。要了解 map() 和 starmap() 之间的区别,请查看以下代码片段:
Python3
li =[(2, 5), (3, 2), (4, 3)]
new_li = list(map(pow, li))
print(new_li)
Python3
from itertools import starmap
li =[(2, 5), (3, 2), (4, 3)]
new_li = list(starmap(pow, li))
print(new_li)
Python3
li =[2, 3, 4, 5, 6, 7]
# adds 2 to each element in list
ans = list(map(lambda x:x + 2, li))
print(ans)
Python3
from itertools import starmap
li =[(2, 3), (3, 1), (4, 6), (5, 3), (6, 5), (7, 2)]
ans = list(starmap(lambda x, y:x + y, li))
print(ans)
Python3
from itertools import starmap
co_ordinates =[(2, 3, 4),
(3, 4, 5),
(6, 8, 10),
(1, 5, 7),
(7, 4, 10)]
# Set true if coordinates form
# a right-triangle else false
right_triangles = list(starmap(lambda x, y, z:True
if ((x * x)+(y * y))==(z * z)
else False, co_ordinates))
print("tuples which form right angled triangle :",
right_triangles, end ="\n\n")
print("The right triangle coordinates are :",
end ="")
# to print the coordinates
for i in range (0, len(right_triangles)):
if right_triangles[i]== True:
print(co_ordinates[i], end =" ")
输出:
TypeError Traceback (most recent call last)
in
1 li=[(2, 5), (3, 2), (4, 3)]
----> 2 new_li=list(map(pow, li))
3 print(new_li)
TypeError: pow expected at least 2 arguments, got 1
在这里,映射将列表中的每个元组视为单个参数,因此会引发错误。 starmap() 克服了这个问题。看下面的代码片段:
Python3
from itertools import starmap
li =[(2, 5), (3, 2), (4, 3)]
new_li = list(starmap(pow, li))
print(new_li)
输出:
[32, 9, 64]
starmap() 的内部工作可以如下实现。
def startmap(function, iterable):
for it in iterables:
yield function(*it)
这里的 'it' 也表示一个可迭代的。
让我们看另一个区分 map() 和 starmap() 的示例。我们可以使用 map() 将函数应用于迭代中的每个元素。要说我们需要为列表中的每个元素添加一个常数,我们可以使用 map()。
Python3
li =[2, 3, 4, 5, 6, 7]
# adds 2 to each element in list
ans = list(map(lambda x:x + 2, li))
print(ans)
输出:
[4, 5, 6, 7, 8, 9]
如果我们想为列表的不同元素添加不同的数字怎么办?
现在,必须使用 starmap()。
Python3
from itertools import starmap
li =[(2, 3), (3, 1), (4, 6), (5, 3), (6, 5), (7, 2)]
ans = list(starmap(lambda x, y:x + y, li))
print(ans)
输出:
[5, 4, 10, 8, 11, 9]
使用 starmap() 的实际示例:
考虑一个包含各种三角形坐标的列表。我们应该应用毕达哥拉斯定理并找到坐标形成直角三角形的输出。它可以如下实现:
Python3
from itertools import starmap
co_ordinates =[(2, 3, 4),
(3, 4, 5),
(6, 8, 10),
(1, 5, 7),
(7, 4, 10)]
# Set true if coordinates form
# a right-triangle else false
right_triangles = list(starmap(lambda x, y, z:True
if ((x * x)+(y * y))==(z * z)
else False, co_ordinates))
print("tuples which form right angled triangle :",
right_triangles, end ="\n\n")
print("The right triangle coordinates are :",
end ="")
# to print the coordinates
for i in range (0, len(right_triangles)):
if right_triangles[i]== True:
print(co_ordinates[i], end =" ")
输出:
形成直角三角形的元组:[False, True, True, False, False]
直角三角形坐标为:(3, 4, 5) (6, 8, 10)
形成直角三角形的元组:[False, True, True, False, False]
直角三角形坐标为:(3, 4, 5) (6, 8, 10)