Python-将字符串拆分为两列

Python-将字符串拆分为两列,python,string,collections,Python,String,Collections,假设我有这个字符串: """line1 line2 line3 line4 line5 line6 line7 line8""" 我想编写一个函数,将其拆分为两个大小相等的列,由单个字符串表示,如下所示: """line1 line5 line2 line6 line3 line7 line4 line8""" 我可以像这样将字符串一分为二: s1,s2=s[:len(s)//2],s[len(s)//2:] 但我不确定如何将它们结合起来……拿着你所拥有的,然后: >>>

假设我有这个字符串:

"""line1
line2
line3
line4
line5
line6
line7
line8"""
我想编写一个函数,将其拆分为两个大小相等的列,由单个字符串表示,如下所示:

"""line1 line5
line2 line6
line3 line7
line4 line8"""
我可以像这样将字符串一分为二: s1,s2=s[:len(s)//2],s[len(s)//2:]


但我不确定如何将它们结合起来……

拿着你所拥有的,然后:

>>> s ="""line1
line2
line3
line4
line5
line6
line7
line8"""
>>> s1, s2 = s[:len(s)//2], s[len(s)//2:]
>>> '\n'.join([' '.join(x) for x in zip(s1.split('\n'),s2[1:].split('\n'))])
'line1 line5\nline2 line6\nline3 line7\nline4 line8'

一行代码,但这是基本前提,只需使用
zip
将序列项配对,然后您就可以
将它们重新连接在一起。

获取您所拥有的,然后:

>>> s ="""line1
line2
line3
line4
line5
line6
line7
line8"""
>>> s1, s2 = s[:len(s)//2], s[len(s)//2:]
>>> '\n'.join([' '.join(x) for x in zip(s1.split('\n'),s2[1:].split('\n'))])
'line1 line5\nline2 line6\nline3 line7\nline4 line8'

一行,但这是基本前提,只需使用
zip
将序列项配对,然后您就可以
将它们重新连接在一起。

这将使它们按顺序排列:

string= string.split('\n')
string2= ""
for line in string:
    string2= string2 + line + " "

这将使他们有序:

string= string.split('\n')
string2= ""
for line in string:
    string2= string2 + line + " "

假设行数为偶数,并且
s1
s2
的大小相同,则可以按如下方式组合它们:

lines = [s1[index] + ' ' + s2[index] for index, val in enumerate(s1)]
'\n'.join(lines)
您也可以连接这两个步骤,但为了清晰起见,我将它们分开了


如果字符串长度不同,则需要添加一些条件,这样会有点混乱

假设行数为偶数,且
s1
s2
的大小相同,则可以按如下方式组合它们:

lines = [s1[index] + ' ' + s2[index] for index, val in enumerate(s1)]
'\n'.join(lines)
您也可以连接这两个步骤,但为了清晰起见,我将它们分开了


如果字符串长度不同,则需要添加一些条件,这样会有点混乱

如果你先分成几行就容易了

lines = s.splitlines()
s1, s2 = lines[:len(lines) // 2], lines[len(lines)//2:]
"\n".join(map(" ".join, zip(s1, s2)))
这适用于偶数行。当行数为奇数时,请使用
itertools.izip_longest
而不是
zip

def join(s1, s2):
    return s1 if s2 is None else " ".join((s1, s2))

不要使用
”。加入
(如果您喜欢神秘的OneLiner,可以将其内联)。

如果您先分成几行,则更容易

lines = s.splitlines()
s1, s2 = lines[:len(lines) // 2], lines[len(lines)//2:]
"\n".join(map(" ".join, zip(s1, s2)))
这适用于偶数行。当行数为奇数时,请使用
itertools.izip_longest
而不是
zip

def join(s1, s2):
    return s1 if s2 is None else " ".join((s1, s2))

代替
“”。join
(如果你喜欢神秘的单行线,你可以将其内联)。

(作为O.p.的一个补充-你可能想使用字符串格式填充列,假设实际行的长度不都相同。)@mgilson总是有
itertools.izip\u longest
。这不是错误的结果吗?OP想要的第一行是
line1line5
,这里的第一行是
line1line2
(作为O.P的旁白-您可能需要使用字符串格式来填充列,假设实际行的长度不都相同。)@mgilson总是有
itertools.izip\u longest
。这不是错误的结果吗?OP想要的第一行是
line1line5
,这里的第一行是
line1line2
。我建议在
join
函数中使用元组而不是列表(即
(s1,s2)
而不是
[s1,s2]
)@mgilson:为什么?我更喜欢
([])
而不是
(())
+1,因为我注意到
zip()
会在行为奇数时删除最后一项。1)元组创建速度更快。2) 元组比列表更适合生成常量,而列表中存在的是要进行变异的列表,但我确实同意,
([])
看起来比
(())
@mgilson更漂亮。事实上,两元组的构造显然要快4倍左右。更改为
()
,仍然可读。谢谢。我建议在
join
函数中使用元组而不是列表(即
(s1,s2)
而不是
[s1,s2]
)@mgilson:为什么?我更喜欢
([])
而不是
(())
+1,因为我注意到
zip()
会在行为奇数时删除最后一项。1)元组创建速度更快。2) 元组比列表更适合生成常量,而列表中存在的是要进行变异的列表,但我确实同意,
([])
看起来比
(())
@mgilson更漂亮。事实上,两元组的构造显然要快4倍左右。更改为
()
,仍然可读。谢谢