Python Reduce : 参数顺序导致错误

问题描述 投票:0回答:1

我试图通过在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函数中不支持,我将非常感激。

python mapreduce reduce
1个回答
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'
© www.soinside.com 2019 - 2024. All rights reserved.