Python代码简化?一行代码,将列表中所有元素相加

6
我正在完成欧拉计划中的项目,试图编写最简洁的代码。我知道这是可能的,所以如何简化以下代码?最好只用一行代码且不使用int->string->int转换。
问题:数字2的1000次方的各位数字之和是多少?
我的回答:
>>> i=0
>>> for item in [int(n) for n in str(2**1000)];i+=item

2
2**1000 这个数值从哪里来的? - Michael Mrozek
2
为什么只写一行代码,你想给谁留下好印象? - Gary Kerr
@Michael Mrozek http://projecteuler.net/index.php?section=problems&id=16@PreludeAndFugue: 我自己 - backus
2
@bball 啊,你的问题最初说的是21000。 - Michael Mrozek
啊,谢谢。我只是从欧拉计划复制粘贴过来的。 - backus
我非常确定你不可能摆脱整型转字符串再转回整型的转换。 - dgrant
3个回答

16
sum(int(n) for n in str(2**1000))

3
有趣的是,这与以下代码完全相同: sum(int(n) for n in str(1<<1000)) - jcao219
最好记录代码,因为下一个阅读它的人可能会像“WTF?”一样。 - James Lin
sum(foo)x=0;for item in foo:x+=item;x更不易读懂? - Jimmy
2
为了好玩,sum(map(int,str(2**1000))) ;) - st0le

3

这不是一行代码,但是它是一个更清晰的生成器解决方案,避免了int->string->int的转换:

def asDigits(n):
    while n:
        n,d = divmod(n,10)
        yield d

print sum(asDigits(2**1000))

给出 1366。

有趣的是,2**10000 中数字的总和为 13561,其数字相加的值与 1366 相同。

当然,如果用二进制表示,2**1000 中数字的总和为 1。(我甚至可以心算!)


0

将单个整数转换为字符串以获取长度:

int(sum(map(lambda x:2**1000/x % 10, (10**x for x in xrange(len(str(2**1000)))))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接