我正在编写一个简单的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.
谁能告诉我我做错了什么?我还是一个初学者。提前致谢。
(不,这不是我的作业。)
答案 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)