2016-10-21 57 views
1

我想通过一个十六进制字符的列表,进入一个lambda函数,减少计算一个总的十进制值。我不知道我在做什么错,但Python解释器将不能识别列表(枚举(逆转(numList))元组的列表。Python:从列表到枚举列表传递给lambda reduce函数

numList = ['3', '0', 'e', 'f', 'e', '1'] 
    reduce(lambda sum,(up,x):sum+ int(x,16)*16**up, 
     enumerate(reversed(numList))) 

当我打印出来

list(enumerate(reversed(numList)) 

这是一个元组列表

[(0, '1'), (1, 'e'), (2, 'f'), (3, 'e'), (4, '0'), (5, '3')] 

但它吐了错误:只能串联元组(而不是“INT”),以元组

UPDATE:

的代码现在与未成年人除了” 0" 的工作加入到拉姆达

reduce(lambda sum,(up,x):sum+ int(x,16)*16**up, 
     list(enumerate(reversed(numList))),0) 

我不明白是什么意思。另外我不确定什么是最好的方法来解决这个问题。

that means you make sure, that it starts with 0 instead of the first Argument - in this case (0,'1') - because otherwise the types dont match? – am2 1 min ago

the third argument you add is initializer. without it, the sum in first iteration will be (0,'1'). so you were trying to evaluate (0,'1')+int(x,16)*16**up which is invalid. – ymonad 14 mins ago

更新2:

reduce(lambda sum,(up,x):sum+ int(x,16)*16**up,enumerate(reversed(numList)),0) 

是一样的好,enumerate()回报ITER和list(enumerate...)是多余的。

标记为已解决。

+1

第三你添加的参数是初始值设定项。没有它,第一次迭代中的'sum'将是'(0,'1')'。所以你试图评估无效的'(0,'1')+ int(x,16)* 16 ** up'。 https://docs.python.org/2/library/functions.html#reduce – ymonad

+0

啊好的。该消息是说我正在尝试将int添加到元组中。 (我在想另一种方式。)我现在明白了,谢谢。 – theMobDog

+1

这意味着你要确保它以0开头而不是第一个参数 - 在这种情况下(0,'1') - 因为否则类型不匹配? – am2

回答

2

当您真正需要的是计算总和时,您不需要使用通用reduce函数。

这工作是变得极其简单:

sum(int(x,16)*16**up for up,x in enumerate(reversed(numList))) 

而且,我要去猜你已经知道你可以做同样的事情是这样的:

int(''.join(numList), 16) 
+0

感谢您的提示。我实际上正在探索如何正确使用lambda函数。如果没有其他更好的答案,我会接受这个作为最终答案。 – theMobDog