56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import re
|
||
|
||
|
||
def is_numeric_key(key):
|
||
# 这个正则表达式匹配由数字、点、括号中的数字或单个字母(小写或大写)组成的字符串,
|
||
# 字母后跟数字,或数字后跟字母,单个字母后跟点,但不能是字母-数字-字母的组合
|
||
pattern = r'^[\d.]+$|^\(\d+\)$|^(\d+)$|^[a-zA-Z]$|^[a-zA-Z]\d+$|^\d+[a-zA-Z]$|^[a-zA-Z]\.$'
|
||
return re.match(pattern, key) is not None
|
||
def process_dict(data):
|
||
if not isinstance(data, dict):
|
||
return data
|
||
|
||
result = {}
|
||
numeric_keys = []
|
||
non_numeric_keys = {}
|
||
|
||
for key, value in data.items():
|
||
if is_numeric_key(key):
|
||
numeric_keys.append((key, value))
|
||
else:
|
||
non_numeric_keys[key] = value
|
||
|
||
if numeric_keys:
|
||
result['items'] = [process_dict(item[1]) for item in sorted(numeric_keys)]
|
||
|
||
for key, value in non_numeric_keys.items():
|
||
if isinstance(value, list):
|
||
processed_list = []
|
||
for item in value:
|
||
if isinstance(item, dict):
|
||
# 处理字典中只有一个键值对的情况
|
||
if len(item) == 1:
|
||
processed_item = process_dict(list(item.values())[0])
|
||
else:
|
||
processed_item = process_dict(item)
|
||
else:
|
||
processed_item = process_dict(item)
|
||
|
||
# 如果处理后的项是只包含一个元素的列表,则展平它
|
||
if isinstance(processed_item, list) and len(processed_item) == 1:
|
||
processed_item = processed_item[0]
|
||
|
||
processed_list.append(processed_item)
|
||
|
||
result[key] = processed_list
|
||
else:
|
||
result[key] = process_dict(value)
|
||
|
||
if len(result) == 1 and 'items' in result:
|
||
return result['items']
|
||
|
||
return result
|
||
data={
|
||
|
||
}
|
||
process_dict() |