【问题标题】:How to Swap Chars like a byte-swap but with in a String with Python?如何像字节交换一样交换字符,但在 Python 中使用字符串?
【发布时间】:2021-11-18 10:04:09
【问题描述】:

我正在寻找最快的方法(从计算上讲):

CDAB 到 ABCD

假设我有这个字符串列表:

a = ['3412','7895','0042','1122','0001']

并且我希望我的输出是一个字符串 b = 12349578420022110100 类似于 16 位字节交换

我的代码是(我将条目用作字符串,但很快就会成为列表):

a = '34127895004211220001'
b = ''
i = 0

while (i < len(a)):
    b = b + a[i + 2:i + 4] + a[i:i + 2]
    i = i + 4

print(b)

b = 12349578420022110100

你认为这种方法是最好的吗?

【问题讨论】:

    标签: python python-3.x string swap


    【解决方案1】:

    只有两种可能性(都基于您的代码):

    a = ['3412', '7895', '0042', '1122', '0001']
    
    def first():
        return ''.join([ i[-2:]+i[:2] for i in a ])
    
    def second():
        return ''.join(map(lambda i: i[-2:]+i[:2], a))
    
    print(first())
    print(second())
    
    import timeit
    
    print(timeit.timeit('first()', globals=globals()))  # 1.14
    print(timeit.timeit('second()', globals=globals()))  # 1.34
    

    如果您有几百万次交换要做,也许我也会首先尝试检查瓶颈是否真的是交换。它也很可能取决于 a 的长度(如果更长的其他方法,例如 numpy 可能会更快)。

    【讨论】:

      【解决方案2】:

      就像@Ashwini 提到的,它取决于输入大小。 但是我的方法是添加多少个可能的functions 所以我的解决方案是这样的:

      def swap(string):
          return string[-2:] + string[:-2]
      
      a = ['3412','7895','0042','1122','0001']
      s = ''.join(swap(a[i]) for i in range(len(a)))
      
      print(s)
      

      【讨论】:

        【解决方案3】:

        这取决于输入大小,如果您的输入大小很小,您当前的方法就可以了。对于更大的输入,建议不要使用+ 来构建大字符串,因为每次都需要分配新内存,并且会发生大量复制并导致二次运行时。

        推荐的方法是建立一个列表并使用str.join加入它:

        >>> a = '34127895004211220001'
        >>> "".join([a[i + 2:i + 4] + a[i:i + 2] for i in range(0, len(a), 4)])
        '12349578420022110100'
        

        文档:

        【讨论】:

          猜你喜欢
          • 2021-06-13
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多