【问题标题】:How to join pairs of strings inside a list [duplicate]如何连接列表中的字符串对[重复]
【发布时间】:2012-04-17 13:57:23
【问题描述】:

我有一个类似的列表

myl = ['A','B','C','D','E','F'] #length always even

现在我想要的输出是'AB','CD','EF'

我试过了

>>> myl = ['A','B','C','D','E','F']
>>> even_pos = myl[::2]
>>> odd_pos = myl[::-2]
>>> odd_pos.reverse()
>>> newlist = zip(even_pos,odd_pos)
>>> for x in newlist:
...     print "".join(list(x))
...
...
AB
CD
EF
>>>

我不喜欢这种方式,因为我觉得这太过分了。

那么,有没有更好的方法来实现我的输出。

【问题讨论】:

    标签: python string list


    【解决方案1】:

    您可以使用列表推导式或生成器表达式简洁地做到这一点:

    >>> myl = ['A','B','C','D','E','F']
    >>> [''.join(myl[i:i+2]) for i in range(0, len(myl), 2)]
    ['AB', 'CD', 'EF']
    >>> print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2))
    AB
    CD
    EF
    

    对于这种特殊情况,您可以将''.join(myl[i:i+2]) 替换为myl[i] + myl[i+1],但是当您想要进行三个或更多的组时,使用''.join() 方法更容易。

    或者来自zip() 文档的替代方案:

    >>> map(''.join, zip(*[iter(myl)]*2))
    ['AB', 'CD', 'EF']
    

    【讨论】:

      【解决方案2】:

      这个怎么样?

      >>> ["%s%s" % (myl[c], myl[c+1]) for c in range(0, 6, 2)]
      ['AB', 'CD', 'EF']
      

      【讨论】:

        【解决方案3】:

        为什么你的方法这么复杂?你基本上可以做你所做的事情,但是在一行中,就像这样:

        [ "".join(t) for t in zip(myl[::2], myl[1::2]) ]
        

        不过,F.J 的回答更有效率。

        【讨论】:

        • 他的方法很复杂,因为他很可能不知道列表推导,所以我不怪他。
        • @jdi:是的,我不知道list comprehensions,然后看到mind = blown
        • @jdi:我实际上是在谈论以myl[::-2] 并反转它以获得奇数位置..
        【解决方案4】:

        我可能会写:

        [myl[i] + myl[i + 1] for i in xrange(len(myl), step=2)]
        

        【讨论】:

        • 我会通过将它们加在一起来避免字符串连接。使用连接或字符串格式。此外,由于显式 x+1 索引,如果列表的大小不均匀,这将中断。
        • 当您只添加两个字符串时,我认为没有任何理由避免与+ 进行字符串连接。它不会导致二次行为,甚至可能会更快一些。并且OP保证长度是均匀的。
        • 但是他不保证列表的大小不能是10k。使用 + 的字符串连接很慢。甚至 Guido 都说要避免它:-)
        【解决方案5】:

        你可以这样做:

        myl = ['A','B','C','D','E','F']
        [''.join(myl[i:i+2]) for i in range(0, len(myl), 2)]
        print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-30
          • 2019-01-05
          • 2018-06-21
          • 1970-01-01
          • 2017-04-18
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          相关资源
          最近更新 更多