<p>这可以在一行中完成(减去导入),不超过O(n)步,不需要编写单独的函数或循环,只需一个标准的map reduce。在</p>
<pre><code>import math # to get math.log10
listofints = [1,2,3,10,12,19,99,100,101,50102030]
n = reduce(lambda x,y:[x[0]*(10**(y[1]+1))+y[0],0],map(lambda x:[x,int(math.log10(x))], listofints))[0]
print(n)
# the number 1231012199910010150102030
</code></pre>
<p>这使用一个标准的<a href="https://en.wikipedia.org/wiki/MapReduce" rel="nofollow noreferrer">map-reduce</a>方法来使用map修饰数字,然后将它们还原为一个数字。在</p>
<p>第一步:</p>
^{pr2}$
<p>获取整数列表,例如:</p>
<pre><code>[1,2,3,10,12,19,99,100,101,50102030]
</code></pre>
<p>然后将它们转换为数字加上以10为底的对数对的列表:</p>
<pre><code>[[1, 0], [2, 0], [3, 0], [10, 1], [12, 1], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
</code></pre>
<p>然后,下一步是将该列表缩减为一个数字:</p>
<pre><code>reduce(lambda x,y:[x[0]*(10**(y[1]+1))+y[0],0],...
</code></pre>
<p>为了做到这一点,你需要把它乘以足够的10次方,以腾出空间将下一个数相加。幸运的是,下一个数字显示它有多大。因此,将一对的数字(第一部分)乘以10乘以下一对(第二部分)的幂(1加上),然后加上第二对的数字(第一部分)。在</p>
<p>降幅如下:</p>
<pre><code>[[1, 0], [2, 0], [3, 0], [10, 1], [12, 1], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[12, 0], [3, 0], [10, 1], [12, 1], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[123, 0], [10, 1], [12, 1], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[12310, 0], [12, 1], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[1231012, 0], [19, 1], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[123101219, 0], [99, 1], [100, 2], [101, 2], [50102030, 7]]
[[12310121999, 0], [100, 2], [101, 2], [50102030, 7]]
[[12310121999100, 0], [101, 2], [50102030, 7]]
[[12310121999100101, 0], [50102030, 7]]
[[1231012199910010150102030, 0]]
</code></pre>
<p>最后,最后一项是[1231012199910010150102030,0],所以取它的第一个元素,即1231012199910010150102030</p>
<h2>更新</h2>
<p>虽然整个map reduce是一个很好的习惯过程,但它在这里是过度的杀戮。这可以完全不使用map,只需使用reduce:</p>
<pre><code>n = reduce(lambda x,y:x*(10**(int(math.log10(y))+1))+y,listofints)
</code></pre>