求助:Python实现4字符块内双字符块交换算法
解决每4字符块内双字符对交换的问题
原代码的问题
你的代码存在两处关键错误:
- 循环逻辑混乱:外层遍历两两字符的临时变量,内层又按4步长遍历索引,两层循环无关联,完全无法实现按4字符块交换的需求。
- 无效修改:
x, y = y, x交换的是从zip中取出的临时变量,根本不会修改原列表data,最终返回的字符串和输入完全一致。
正确实现方案
利用Python字符串切片特性,按4字符块分割字符串,对每个块交换前2位和后2位,再拼接结果。以下是两种实现方式:
方式一:严谨处理(兼容长度非4倍数的情况)
def swap_blocks(data): # 移除字符串中的空格(如果有) cleaned_data = data.replace(" ", "") result = [] # 按每4个字符为一个块遍历 for i in range(0, len(cleaned_data), 4): block = cleaned_data[i:i+4] # 仅对完整的4字符块进行交换 if len(block) == 4: swapped_block = block[2:] + block[:2] result.append(swapped_block) else: # 不足4个字符的块保持原样 result.append(block) return ''.join(result)
方式二:简洁实现(假设字符串长度是4的倍数)
若能确保输入字符串长度始终是4的倍数,可用列表推导式简化:
def swap_blocks(data): cleaned_data = data.replace(" ", "") return ''.join([cleaned_data[i+2:i+4] + cleaned_data[i:i+2] for i in range(0, len(cleaned_data), 4)])
测试验证
带空格的示例输入:如果需要保留空格分隔,可修改代码先拆分再处理:
def swap_blocks_with_spaces(data): parts = data.split() swapped_parts = [part[2:] + part[:2] for part in parts if len(part) ==4] return ' '.join(swapped_parts)调用
swap_blocks_with_spaces("2d14 56f2")会得到预期的"142d f256"。处理目标长字符串:
target_str = "2d14541501158000000000001e000000190000000000030003000300030000200800e01e7c580000d462866058040908018f1d196d0ed5628660f60801001900fc1e" print(swap_blocks(target_str))输出开头为
"142d15541501...",符合需求。
内容的提问来源于stack exchange,提问作者aleyazor
相关产品推荐
相关产品推荐

