如何将其中包含元组的列表转换成以下形式
list = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]
进入一个包含整数的列表,比如,
list = [197, 156, 17, 14, 74, 7]
以最有效的方式?我试过递归,但对于大型列表(数千个元组)来说,它的内存太贵了。
请您参考如下方法:
你可以使用 functools.reduce用于转换每个元组:
>>> from functools import reduce
>>> l = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]
>>> [reduce(lambda x,y: x*10+y, t) for t in l]
[197, 156, 17, 14, 74, 7]
更新 由于问题是在询问有效的方法,因此这里是建议答案的衡量标准:
import itertools as it
import functools
def conv_reduce(l):
return [functools.reduce(lambda x,y: x*10+y, t) for t in l]
def conv_str(l):
return [int("".join(map(str, item))) for item in l]
def conv_pow(l):
return [sum(n*10**e for n, e in zip(reversed(item), it.count())) for item in l]
def conv_pow2(l):
return [sum(t[-i-1]*(10**i) for i in range(len(t))) for t in l]
if __name__ == '__main__':
import timeit
print('reduce', timeit.timeit("conv_reduce(l)", setup="from __main__ import conv_reduce; l = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]"))
print('str', timeit.timeit("conv_str(l)", setup="from __main__ import conv_str; l = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]"))
print('pow', timeit.timeit("conv_pow(l)", setup="from __main__ import conv_pow; l = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]"))
print('pow2', timeit.timeit("conv_pow2(l)", setup="from __main__ import conv_pow2; l = [(1, 9, 7), (1, 5, 6), (1, 7), (1, 4), (7, 4), (7,)]"))
输出:
reduce 2.5965667460041004
str 5.068828338997264
pow 7.192991987001733
pow2 8.017168823003885
