Python Reduce:参数顺序导致错误

时间:2020-06-10 07:50:44

标签: python mapreduce 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函数中不支持+操作数,将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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