如何在Python中将列表的列表(元组)转换为带有优雅分隔符的字符串

1 投票
2 回答
1708 浏览
提问于 2025-04-16 19:32

如何将一个包含列表或元组的列表转换成带有逐渐增加缩进的字符串呢?
到目前为止,我写出了这样的一个函数。

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' 参数?或者有没有其他方法可以做到这一点?

2 个回答

0

你可以这样修改你的函数:

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, 2], [3, 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())',或者你也可以用'type(val) in [list, tuple, set]'来判断。

0

你需要准备的内容如下:

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

递归真棒!:)

撰写回答