为了正确格式化字符串,我需要将其拆分为不同长度的块 .
举个例子,这是一个字符串 - 25c319f75e3fbed5a9f0497750ea12992b30d565
,为了将它拆分成固定长度的块,我只需要使用步骤和切片:
s = '25c319f75e3fbed5a9f0497750ea12992b30d565'
n = 2
print("-".join([s[i:i+n] for i in range(0, len(s), n)]))
但是,如果 n
是要拆分的数字列表,我该怎么办?例如:
s = '25c319f75e3fbed5a9f0497750ea12992b30d565'
n = [8, 4, 4, 4, 4, 12] # edited for consistency - Coldspeed
我做的唯一解决方案就是:
print("-".join([s[0:8], s[8:12], s[12:16], s[16:20], s[20:24], s[24:32]]))
哪个不是pythonic,更不一定不可靠的字符串长度很大 .
最后一个代码示例的输出:
25c319f7-5e3f-bed5-a9f0-4977-50ea1299
那么这可以用更多的pythonic单线方式来完成吗?如果没有,还有什么其他更自动的方法呢?
5 回答
我担心的不是单线性的,而是从我的头脑中:
输出是一个数组,其中包含可以相应操作的相应字符串:
产量
使用itertools.islice以增量方式从字符串和切片创建迭代器:
请注意,如果切片的总大小不等于字符串的长度,则字符串的尾部会丢失;迭代器并没有完全耗尽 .
您可以在最终预处理阶段追加尾部(如果需要):
这是另一种使用for循环的方法,通过增加起始索引逐步切割字符串:
如果我们从列出的数据开始:
我们可以使用扫描来查找每个部分的开头或结尾:
看起来
accumulate
特定于Python 3,因此我们可能需要一种解决方法来在Python 2中进行扫描(这个在O(n²)处慢):然后我们可以使用组合来提取部件:
所有这些长度/索引操作的优点是它不会创建字符串的副本,只创建其各个部分 . 否则肖恩的解决方案非常整洁 .