170 lines
8.0 KiB
Python
170 lines
8.0 KiB
Python
import json
|
||
import re
|
||
#这个字典可能有嵌套,你需要遍历里面的键名,对键名作判断,而不是键值,具体是这样的:如果处于同一层级的键的数量>1并且键名全由数字或点号组成。那么就将这些序号键名全部删除,重新组织成一个字典格式的数据,你可以考虑用字符串列表来保持部分平级的数据
|
||
#对于同级的键,如果数量>1且键名都统一,那么将键名去掉,用列表保持它们的键值
|
||
#对于同一个字典中,可能存在若干键值对,若它们的键值都是""或者"/" 你就将它们的键值删去,它们的键名用字符串列表保存
|
||
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
|
||
#TODO:如果键值中存在数字就不行
|
||
#zbtest20也有问题
|
||
def contains_number_or_index(key, value):
|
||
# 判断值是否是数字或数字字符串
|
||
is_number = isinstance(value, (int, float)) or (isinstance(value, str) and value.isdigit())
|
||
# 判断键是否包含 "序号"
|
||
contains_index = '序号' in key
|
||
# 判断值中是否包含数字
|
||
contains_digit = isinstance(value, str) and re.search(r'\d+', value)
|
||
# 判断值中是否包含中文字符
|
||
contains_chinese = isinstance(value, str) and re.search(r'[\u4e00-\u9fff]', value)
|
||
# 如果值中包含数字但也有中文字符,则保留(返回 False)
|
||
if contains_digit and contains_chinese:
|
||
return False
|
||
# 如果值是数字或包含数字,且不包含中文字符,或者键包含 "序号",返回 True
|
||
return is_number or contains_index or contains_digit
|
||
|
||
#对于同一个字典中,可能存在若干键值对,若它们的键值都是""或者"/" 你就将它们的键值删去,它们的键名用字符串列表保存
|
||
#如果键名是"序号"或者键值中全是数字,删去序号
|
||
def preprocess_dict(data):
|
||
if isinstance(data, dict):
|
||
if len(data) > 1:
|
||
# 检查是否所有值都是 "" 或 "/"
|
||
if all(v == "" or v == "/" for v in data.values()):
|
||
return list(data.keys())
|
||
else:
|
||
processed = {}
|
||
for k, v in data.items():
|
||
if not contains_number_or_index(k, v):
|
||
processed_v = preprocess_dict(v)
|
||
if processed_v != "": # 只添加非空值
|
||
processed[k] = processed_v
|
||
return processed
|
||
else:
|
||
return {k: preprocess_dict(v) for k, v in data.items()}
|
||
elif isinstance(data, list):
|
||
return [preprocess_dict(item) for item in data]
|
||
else:
|
||
return data
|
||
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
|
||
|
||
# 处理数字键,不再要求数量>1
|
||
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) and len(value) > 1 and all(isinstance(item, dict) and len(item) == 1 for item in value):
|
||
common_key = next(iter(value[0].keys()))
|
||
if all(common_key in item and len(item) == 1 for item in value):
|
||
result[key] = [process_dict(item[common_key]) for item in value]
|
||
else:
|
||
result[key] = [process_dict(item) for item in value]
|
||
else:
|
||
result[key] = process_dict(value)
|
||
|
||
# 如果结果只包含'items'键,直接返回其值
|
||
if len(result) == 1 and 'items' in result:
|
||
return result['items']
|
||
|
||
return result
|
||
|
||
# 测试代码
|
||
#TODO:同一层全部都是数字才成功删除
|
||
input_data = {
|
||
"符合性审查": {
|
||
"说明": "1",
|
||
"www":"哈哈",
|
||
"审查标准": [
|
||
{
|
||
"序号": 1,
|
||
"内容": "投标总报价超过项目(分包)预算金额或最高限价的;"
|
||
},
|
||
{
|
||
"序号": 2,
|
||
"内容": "《投标书》、《法定代表人授权书》、《开标一览表(含明细)》未提供或不符合招标文件要求的;"
|
||
},
|
||
{
|
||
"序号": 3,
|
||
"内容": "工期(服务期限)、质保期不符合招标文件要求的;"
|
||
},
|
||
{
|
||
"序号": 4,
|
||
"内容": "出现两个或两个以上不同报价的;"
|
||
},
|
||
{
|
||
"序号": 5,
|
||
"内容": "出现两个或两个以上投标方案的(招标文件中要求提供备选方案的除外);"
|
||
},
|
||
{
|
||
"序号": 6,
|
||
"内容": "投标报价存在缺项、漏项的;"
|
||
},
|
||
{
|
||
"序号": 7,
|
||
"内容": "投标有效期不足的;"
|
||
},
|
||
{
|
||
"序号": 8,
|
||
"内容": "无法定代表人签字(签章)或签字人无法定代表人有效授权的;"
|
||
},
|
||
{
|
||
"序号": 9,
|
||
"内容": "未按要求提供加盖公章及签字(签章)的;"
|
||
},
|
||
{
|
||
"序号": 10,
|
||
"内容": "符合招标文件第二章“投标人须知”中 39条中规定情形,以分公司形式参与投标的,法定代表人授权书未由总公司法定代表人签字(签章)并加盖公章的;"
|
||
},
|
||
{
|
||
"序号": 11,
|
||
"内容": "依据财库[2019]9号文的规定,招标文件采购清单中为“节能产品”的货物,未提供国家确定的认证机构出具的节能产品认证证书的;"
|
||
},
|
||
{
|
||
"序号": 12,
|
||
"内容": "所投货物是通过中国海关报关验放进入中国境内且产自关境外的(招标文件中注明已办理进口产品审核的除外);"
|
||
},
|
||
{
|
||
"序号": 13,
|
||
"内容": "未提供所投货物(工程或服务)的具体参数值或功能表述,或原文复制招标文件的技术规格相关部分内容作为其投标文件的一部分的;"
|
||
},
|
||
{
|
||
"序号": 14,
|
||
"内容": "不满足招标文件第三章“项目技术、服务和商务要求”中“★”号条款要求的;"
|
||
},
|
||
{
|
||
"序号": 15,
|
||
"内容": "含有采购人不能接受的附加条件的;"
|
||
},
|
||
{
|
||
"序号": 16,
|
||
"内容": "未按要求提供《符合性审查对照表》、《商务要求响应、偏离说明表》、《商务要求“★”号条款响应、偏离说明表》、《商务评议对照表》和《技术、服务要求响应、偏离说明表》、《技术、服务要求“★”号条款响应、偏离说明表》、《技术、服务评议对照表》的;"
|
||
},
|
||
{
|
||
"序号": 17,
|
||
"内容": "不同投标人使用同一电脑(机器特征值一致:如 MAC地址等)或使用同一电子密钥,编制或上传电子投标文件;"
|
||
},
|
||
{
|
||
"序号": 18,
|
||
"内容": "法律、法规和招标文件规定的其他无效投标情形。"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
pred=preprocess_dict(input_data)
|
||
print(json.dumps(pred, ensure_ascii=False, indent=4))
|
||
# processed_data = process_dict(pred)
|
||
# print(json.dumps(processed_data, ensure_ascii=False, indent=4)) |