问题描述
||
将列表/元组列表转换为带有增量缩进的字符串的最佳方法是什么?
到目前为止,我已经有了这样的功能
def a2s(a,inc = 0):
inc += 1
sep = \' \' * inc
if type(a) == type(list()) or type(a) == type(tuple()):
a = sep.join(map(a2s,a))
else:
a = str(a)
return a
它会给
>>> a=[[1,2],[3,4]]
>>> a2s(a)
\'1 2 3 4\'
所以问题是如何使[1,2]
和[3,4]
之间的增量更大,像这样
>>> a2s(a)
\'1 2 3 4\'
是否有任何方法通过map函数传递不可迭代的\'inc \'参数?还是其他方式可以做到这一点?
解决方法
这是您需要的:
import collections
def a2s(a):
res = \'\'
if isinstance(a,collections.Iterable):
for item in a:
res += str(a2s(item)) + \' \'
else:
res = str(a)
return res
用法:
a = [ [1,2],[3,4] ]
print(a2s(a))
>>> 1 2 3 4
递归岩! :)
, 您可以通过以下方式修改您的函数:
def list_to_string(lVals,spacesCount=1):
for i,val in enumerate(lVals):
strToApp = \' \'.join(map(str,val))
if i == 0:
res = strToApp
else:
res += \' \' * spacesCount + strToApp
return res
print list_to_string(a)# \'1 2 3 4\'
print list_to_string(a,2)# \'1 2 3 4\'
print list_to_string(a,3)# \'1 2 3 4\'
还是有点怪,但是:
from collections import Iterable
data = [[1,4],[5,6],7]
def list_to_string(lVals,spacesCount=3):
joinVals = lambda vals: \' \'.join(map(str,vals)) if isinstance(vals,Iterable) else str(vals)
return reduce(lambda res,x: joinVals(res) + (\' \' * spacesCount) + joinVals(x),lVals)
list_to_string(data,4)
并且最好使用\'isinstance \'而不是\'type(val)== type(list())\',或者您可以在[list,tuple,set] \中使用\'type(val)\' 。