Python:在int列表中使用sum()

时间:2012-07-18 04:24:03

标签: python python-2.7

我正在编写一个简单的python脚本,它接受一个数字,将其转换为二进制,并返回二进制数字的总和。这是我到目前为止所拥有的。

#!/usr/bin/python

def sum2(n):
    a = str(bin(n))
    b = a.replace('0b', '')
    return sum([map(int, x) for x in b])

n = int(raw_input("Input number>"))
print sum2(n)

用简单的英语我取 n 并将其转换为二进制,然后将其转换为字符串。我砍掉 0b (来自 bin())并将二进制字符转换为整数列表,然后尝试 sum()它们。

当试图弄清楚如何将数字加在一起时,我用Google搜索并发现我应该能够 sum()一个整数列表。当我尝试这样做时,我最终得到了这个追溯。

Traceback (most recent call last):
  File "D:\scripts\sum2n1.py", line 9, in <module>
    print sum2(x)
  File "D:\scripts\sum2n1.py", line 6, in sum2
    return sum([map(int, x) for x in b])
TypeError: unsupported operand type(s) for +: 'int' and 'list'

所以我发现 sum()需要一个“可迭代”来完成它的工作。我谷歌周围发现有一个我可以调用的iter()函数,但它似乎没有用。

There's also __iter__() which doesn't work either.

谁能告诉我我做错了什么?我还是一个初学者。提前致谢。

(不,这不是我的作业。)

7 个答案:

答案 0 :(得分:6)

为什么不简单

def sum2(n):
    return sum(x=='1' for x in bin(n))

甚至更简单

def sum2(n):
    return bin(n).count('1')

答案 1 :(得分:5)

您正在将列表推导与map函数结合使用,显然尝试两次执行相同的操作。你想要:

sum(int(x) for x in b)

sum(map(int, b))

答案 2 :(得分:3)

这有效:

def sum2(n):
    idx = 3 if n < 0 else 2 # adjust index for slice based on neg/pos number
    a = bin(n)[idx:]        # doesn't assign the '0b' (or '-0b' for negatives)

    return sum(int(i) for i in a)  # convert chars into ints and sum

注意,使用切片表示法来消除前导'0b''-0b'比使用replace()更好。

您可以使用列表推导或生成器表达式。

更新

在一篇有用的评论中@DSM指出负数在二进制字符串前面有'-0b',我更新了代码,通过根据数字的符号调整切片来处理这个问题。

答案 3 :(得分:2)

尝试在返回时执行此操作

return sum(map(int,b))

应该有效

答案 4 :(得分:2)

通过[map(int, x) for x in b],你做了两次相同的事情。 map(int, b)会使每个数字成为一个整数。或[int(x) for x in b]也会这样做。但你两个都做。选择一个或另一个。尝试:

sum([int(x) for x in b])

答案 5 :(得分:1)

不要将地图调用包装在列表推导中。

而不是

return sum([map(int, x) for x in b])

这样做:

return sum(map(int, b))

答案 6 :(得分:0)

使用reduce:

ans = reduce(lambda x,y:int(x)+int(y), L)