如何像字节交换一样交换字符,但在 Python 的字符串中?
How to Swap Chars like a byte-swap but with in a String with Python?
我正在寻找最快的方法(从计算上来说):
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
您认为这种方法是最好的方法吗?
这取决于输入大小,如果您的输入大小很小,您当前的方法就可以了。对于更大的输入,建议不要使用 +
来构建大字符串,因为每次都需要分配新内存并且会发生大量复制并导致二次运行时间。
推荐的方法是建立一个列表并使用 str.join
:
加入它
>>> a = '34127895004211220001'
>>> "".join([a[i + 2:i + 4] + a[i:i + 2] for i in range(0, len(a), 4)])
'12349578420022110100'
文档:
就像@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)
只有两种可能性(均基于您的代码):
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 可能更快)。
我正在寻找最快的方法(从计算上来说):
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
您认为这种方法是最好的方法吗?
这取决于输入大小,如果您的输入大小很小,您当前的方法就可以了。对于更大的输入,建议不要使用 +
来构建大字符串,因为每次都需要分配新内存并且会发生大量复制并导致二次运行时间。
推荐的方法是建立一个列表并使用 str.join
:
>>> a = '34127895004211220001'
>>> "".join([a[i + 2:i + 4] + a[i:i + 2] for i in range(0, len(a), 4)])
'12349578420022110100'
文档:
就像@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)
只有两种可能性(均基于您的代码):
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 可能更快)。