Python Reduce:参数的顺序会导致错误



我试图通过在Colab Notebook中运行以下命令来理解Python中Reduce的过程:

pList20 = ["Ram", "RamPM", "Shyam", "PMShyam", "Sita", "SiPMMta"]
print(pList20)
pList21A = list(map(lambda x : (x,len(x)),pList20) )    # returns a list of tuples
print(pList21A)
pList21B = list(map(lambda x : (len(x),x),pList20) )    # returns a list of tuples
print(pList21B)
print('----')
print(pList21A)
pVal22A = functools.reduce(lambda x,y: (x[0]+y[0], x[1]+y[1]), pList21A)  #   adding and concatenating elements in a list
print(pVal22A)
print(pList21B)
pVal22B = functools.reduce(lambda x,y: (x[0]+y[0], x[1]+y[1]), pList21B)  #   adding and concatenating elements in a list
print(pVal22B)
print('----')
#print(pList21A)
#pVal22C = functools.reduce(lambda x,y: (x[1]+y[1], x[0]+y[0]), pList21A)  #   adding and concatenating elements in a list
#print(pVal22C)
print(pList21B)
pVal22D = functools.reduce(lambda x,y: (x[1]+y[1], x[0]+y[0]), pList21B)  #   adding and concatenating elements in a list
print(pVal22D)

前两个 reduce 函数按预期执行,但后两个函数引发错误。输出和错误如下所示。

无法弄清楚出了什么问题

['Ram', 'RamPM', 'Shyam', 'PMShyam', 'Sita', 'SiPMMta']
[('Ram', 3), ('RamPM', 5), ('Shyam', 5), ('PMShyam', 7), ('Sita', 4), ('SiPMMta', 7)]
[(3, 'Ram'), (5, 'RamPM'), (5, 'Shyam'), (7, 'PMShyam'), (4, 'Sita'), (7, 'SiPMMta')]
----
[('Ram', 3), ('RamPM', 5), ('Shyam', 5), ('PMShyam', 7), ('Sita', 4), ('SiPMMta', 7)]
('RamRamPMShyamPMShyamSitaSiPMMta', 31)
[(3, 'Ram'), (5, 'RamPM'), (5, 'Shyam'), (7, 'PMShyam'), (4, 'Sita'), (7, 'SiPMMta')]
(31, 'RamRamPMShyamPMShyamSitaSiPMMta')
----
[(3, 'Ram'), (5, 'RamPM'), (5, 'Shyam'), (7, 'PMShyam'), (4, 'Sita'), (7, 'SiPMMta')]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-b1b1ac48507f> in <module>()
17 #print(pVal22C)
18 print(pList21B)
---> 19 pVal22D = functools.reduce(lambda x,y: (x[1]+y[1], x[0]+y[0]), pList21B)  #   adding and concatenating elements in a list
20 print(pVal22D)
<ipython-input-41-b1b1ac48507f> in <lambda>(x, y)
17 #print(pVal22C)
18 print(pList21B)
---> 19 pVal22D = functools.reduce(lambda x,y: (x[1]+y[1], x[0]+y[0]), pList21B)  #   adding and concatenating elements in a list
20 print(pVal22D)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

如果这是非常简单的事情,我很抱歉,但如果有人能解释为什么前两个reduce函数支持+操作数,但在后两个reduce函数中不受支持,我将不胜感激。

lambda x,y: (x[1]+y[1], x[0]+y[0])的输出交换组件的顺序。

  • 首先,它处理前两个元素;(3, 'Ram')(5, 'RamPM')('RamRamPM', 8).
  • 然后它尝试使用第三个元素处理结果;('RamRamPM', 8)(5, 'Shyam')给出错误,因为它试图添加'RamRamPM' + 58 + 'Shyam'

最新更新