将列表转换为字符串列表 Python

3
我是Python初学者,有点拿不准。如何将例如a = [[1,2],[3,4],[5,6]]转换为"12\n34\n56"的字符串格式?
这是我所能做到的,但它会将每个数字都放在新的一行上:
def change(a):
    c = ""
    for r in a:
        for b in r:
            c += str(b) + "\n"
    return c
2个回答

12
但是每个数字后都会换行,这是因为您是在每个数字之后添加换行符而不是在每个子列表r之后添加。如果您想要后者,请在那里添加换行符。
c = ''
for r in a:
    for b in r:
        c += str(b)
    c += '\n'
return c

注意,在字符串后面添加内容是非常低效的,因为它会创建大量中间字符串。通常情况下,你应该使用列表来存储字符串部分并将其连接成单个字符串:

c = []
for r in a:
    for b in r:
        c.append(str(b))
    c.append('\n')
return ''.join(c)

同时,您还可以使用列表表达式将此过程缩短为多个步骤; 首先是内部列表:

c = []
for r in a:
    c.extend([str(b) for b in r])
    c.append('\n')
return ''.join(c)

你可以首先加入那个列表解析:

c = []
for r in a:
    c.append(''.join([str(b) for b in r]))
    c.append('\n')
return ''.join(c)

然后,您可以将换行符移入外部连接,并为外部列表创建一个新的列表推导式:

c = [''.join([str(b) for b in r]) for r in a]
return '\n'.join(c)

在那个时候,您也可以将其制作成一个一行的代码:

return '\n'.join([''.join([str(b) for b in r]) for r in a])

如评论中Padraic所指出的,使用换行符进行连接也可以防止字符串在循环中添加尾随\n。否则,您可以使用str.rstrip('\n')在之后将其去掉。

非常感谢您的出色解释! :) - Hybr1d
我会选择稍微冗长一点但使用列表推导式的版本:'\n'.join([''.join([str(v) for v in u]) for u in a])。生成器版本看起来更整洁,但列表推导式的开销较小。并且将生成器表达式传递给 join() 没有优势,因为它需要在开始工作之前获取所有子字符串(否则使用简单的字符串连接和使用 join() 之间就没有优势)。 - PM 2Ring
2
你的代码实际上给出了错误的结果,我本来有一个答案,但是因为你先回答了,所以我删除了。但你需要去掉最后一个换行符,或者在确定位置时进行检查,如果你处于最后一组,则不要添加换行符。 - Padraic Cunningham
@PadraicCunningham:+1。或者只需使用基于join的方法,这样就不会得到不需要的尾随\n。或者,只需使用切片从字符串中删除尾随\n...但这有点凌乱。 - PM 2Ring
@PM2Ring,没错,join肯定是要用的解决方案,我只是想说如果你真的使用循环,那么你必须注意到这一点。 - Padraic Cunningham

7

使用str.join生成器表达式

>>> a = [[1,2], [3,4], [5,6]]
>>> '\n'.join(''.join(map(str, xs)) for xs in a)
'12\n34\n56'

只是好奇,为什么你要使用 map(str, xs) 而不是直接使用 str(xs)?后者不是更便宜吗? - bosnjak
@Lawrence,str(xs)的结果是'[1, 2]',而''.join(map(str, [1, 2]))会得到12 - falsetru
好的,我错过了xs实际上是一个列表这个事实 :) - bosnjak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接