python列表转为一个数字_将整数列表转换为一个数字?

两种解决方案:

>>> nums = [1, 2, 3]

>>> magic = lambda nums: int(''.join(str(i) for i in nums)) # Generator exp.

>>> magic(nums)

123

>>> magic = lambda nums: sum(digit * 10 ** (len(nums) - 1 - i) # Summation

... for i, digit in enumerate(nums))

>>> magic(nums)

123

该map取向的解决方案实际上出来向前在我的箱子-你绝对不应该使用sum的东西,可能是大数:

时间比较

import collections

import random

import timeit

import matplotlib.pyplot as pyplot

MICROSECONDS_PER_SECOND = 1E6

FUNS = []

def test_fun(fun):

FUNS.append(fun)

return fun

@test_fun

def with_map(nums):

return int(''.join(map(str, nums)))

@test_fun

def with_interpolation(nums):

return int(''.join('%d' % num for num in nums))

@test_fun

def with_genexp(nums):

return int(''.join(str(num) for num in nums))

@test_fun

def with_sum(nums):

return sum(digit * 10 ** (len(nums) - 1 - i)

for i, digit in enumerate(nums))

@test_fun

def with_reduce(nums):

return int(reduce(lambda x, y: x + str(y), nums, ''))

@test_fun

def with_builtins(nums):

return int(filter(str.isdigit, repr(nums)))

@test_fun

def with_accumulator(nums):

tot = 0

for num in nums:

tot *= 10

tot += num

return tot

def time_test(digit_count, test_count=10000):

"""

:return: Map from func name to (normalized) microseconds per pass.

"""

print 'Digit count:', digit_count

nums = [random.randrange(1, 10) for i in xrange(digit_count)]

stmt = 'to_int(%r)' % nums

result_by_method = {}

for fun in FUNS:

setup = 'from %s import %s as to_int' % (__name__, fun.func_name)

t = timeit.Timer(stmt, setup)

per_pass = t.timeit(number=test_count) / test_count

per_pass *= MICROSECONDS_PER_SECOND

print '%20s: %.2f usec/pass' % (fun.func_name, per_pass)

result_by_method[fun.func_name] = per_pass

return result_by_method

if __name__ == '__main__':

pass_times_by_method = collections.defaultdict(list)

assert_results = [fun([1, 2, 3]) for fun in FUNS]

assert all(result == 123 for result in assert_results)

digit_counts = range(1, 100, 2)

for digit_count in digit_counts:

for method, result in time_test(digit_count).iteritems():

pass_times_by_method[method].append(result)

for method, pass_times in pass_times_by_method.iteritems():

pyplot.plot(digit_counts, pass_times, label=method)

pyplot.legend(loc='upper left')

pyplot.xlabel('Number of Digits')

pyplot.ylabel('Microseconds')

pyplot.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值