📜  Python – Itertools.starmap()

📅  最后修改于: 2022-05-13 01:54:26.239000             🧑  作者: Mango

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)