【问题标题】:Python - split string into two columnsPython - 将字符串分成两列
【发布时间】:2012-07-22 02:37:54
【问题描述】:

假设我有这个字符串:

"""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:]

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

【问题讨论】:

    标签: python string collections


    【解决方案1】:
    s='''line1
    line2
    line3
    line4
    line5
    line6
    line7
    line8'''
    
    lines=s.split()
    halflen = len(lines)/2
    columns = '\n'.join(' '.join((lines[x],lines[x+halflen])) for x in range(halflen))
    

    【讨论】:

    • (作为 O.P. 的旁白——假设实际行的长度不同,您可能希望使用字符串格式来填充列。)
    • @mgilson 总是有itertools.izip_longest
    • 这不是错误的结果吗? OP想要的第一行是line1 line5,这里的第一行是line1 line2
    【解决方案2】:

    如果你先分成几行会更容易。

    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(如果你喜欢神秘的单线,你可以内联它)。

    【讨论】:

    • 我建议在 join 函数中使用元组而不是列表(即 (s1, s2) 而不是 [s1, s2]
    • @mgilson:为什么?我更喜欢([]) 而不是(())
    • +1 表示zip() 将在行奇数时删除最后一项。
    • 1) 元组的创建速度更快。 2) 元组更适合于制作常量,而不是存在要变异的列表——但我同意([]) 看起来比(()) 更漂亮
    • @mgilson:确实,二元组构造显然快了 4 倍。更改为 () 仍然可读。谢谢。
    【解决方案3】:

    拿走你所拥有的,然后:

    >>> 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 将序列项配对,然后您可以join 将它们重新组合在一起。

    【讨论】:

      【解决方案4】:

      这将使它们按顺序排列:

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

      【讨论】:

        【解决方案5】:

        假设您有偶数行并且s1s2 的大小相同,您可以将它们组合如下:

        lines = [s1[index] + ' ' + s2[index] for index, val in enumerate(s1)]
        '\n'.join(lines)
        

        您也可以连接这两个步骤,但为了清楚起见,我将它们分开。

        如果您的字符串长度不同,您将需要添加一些条件,这会变得有点混乱。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          相关资源
          最近更新 更多