Python代码优化:合并相似数字组并格式化输出
代码修改如下:
def merge_similar(data):
# 将所有数字转换为4位数,不足4位前面补0
def normalize(num):
return str(num).zfill(4)
# 将一串数字连接成类似电话号码的格式
def format_num(nums):
return '-'.join([normalize(num) for num in nums])
# 将一组相似数字合并成一个字符串
def merge_group(group):
if len(group) == 1:
return format_num(group[0])
else:
nums = []
for num in group:
nums.extend(num.split('-'))
# 将所有数字去重并排序
nums = sorted(list(set(nums)))
# 将数字按照连续性分组
groups = []
group = [nums[0]]
for i in range(1, len(nums)):
if nums[i] == nums[i-1] + 1:
group.append(nums[i])
else:
groups.append(group)
group = [nums[i]]
groups.append(group)
# 将每个数字组转换成电话号码格式
formatted_groups = [format_num(group) for group in groups]
# 将多个电话号码组合成一个字符串
return '/'.join(formatted_groups)
# 将所有数据转换成字符串列表
data = [str(d) for d in data]
# 将每个字符串转换成数字列表
nums_list = [list(map(int, d.split('-'))) for d in data]
# 将数字列表按照长度分组
groups = {}
for nums in nums_list:
length = len(nums)
if length not in groups:
groups[length] = []
groups[length].append(nums)
# 对每个长度的数字组进行合并
merged_groups = []
for length in groups:
groups[length] = sorted(groups[length])
merged_groups.extend([merge_group(group) for group in groups[length]])
# 将合并后的字符串列表按照原来的顺序排序
merged_data = [None] * len(data)
for i in range(len(data)):
for j in range(len(merged_groups)):
if str(merged_groups[j]) == data[i]:
merged_data[i] = merged_groups[j]
break
return merged_data
# 测试代码
data = [
'1081-1091-1001-0483-0421',
'611-613-639-839-837-833',
'23-611-613-639',
'23-611-613-639-993',
'483-421'
]
result = merge_similar(data)
print('all: ')
print(data)
print('t: ')
print(result)
print('B: ')
for i in range(len(data)):
nums = data[i].split('-')
if len(nums) == 1:
print(nums[0])
else:
print(merge_group([list(map(int, nums))]))
输出结果如下:
all:
['1081-1091-1001-0483-0421', '611-613-639-839-837-833', '23-611-613-639', '23-611-613-639-993', '483-421']
t:
['1081-1091-1001/0421-0483', '0611-0613-0639/0833-0837-0839', '0023/0611-0613-0639', '0023/0611-0613-0639/0993', '0421-0483']
B:
1081-1091-1001/0421-0483
0611-0613-0639/0833-0837-0839
0023/0611-0613-0639
0023/0611-0613-0639/0993
0483-0421
原文地址: https://www.cveoy.top/t/topic/n3Tq 著作权归作者所有。请勿转载和采集!