156 lines
9.0 KiB
Python
156 lines
9.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
|
||
|
||
# 测试代码
|
||
|
||
input_data = {
|
||
"资格性审查": {
|
||
"资格证明文件审查": [
|
||
"应具备《政府采购法》第二十二条第一款规定的条件,提供下列材料:",
|
||
{
|
||
"法人或者其他组织的营业执照等证明文件,自然人的身份证明(投标人根据自身情况提供对应的证明材料)": {
|
||
"法人": {
|
||
"企业法人(包括合伙企业)": "提供工商部门注册的有效“企业法人营业执照” 或“营业执照”;",
|
||
"事业单位法人": "提供有效的“事业单位法人证书”。"
|
||
},
|
||
"其他组织": {
|
||
"非企业专业服务机构": "提供执业许可证等证明文件;",
|
||
"个体工商户": "提供有效的“个体工商户营业执照”。"
|
||
},
|
||
"自然人": "提供有效的自然人身份证明。(仅限中国公民)"
|
||
}
|
||
},
|
||
{
|
||
"财务状况报告,依法缴纳税收和社会保障资金的相关材料(投标人根据自身情况提供对应的证明材料)": {
|
||
"法人": {
|
||
"财务状况报告": {
|
||
"(1)": "提供经第三方审计的财务报告(完整的财务报告,包括“四表一注”, 即资产负债表、利润表、现金流量表、所有者权益变动表及其附注),或其基 本开户银行出具的资信证明;",
|
||
"(2)": "部分其他组织和自然人:没有经第三方审计的财务报告的,可以提供银行出具 的资信证明;",
|
||
"(3)": "投标人没有经第三方审计的财务报告和资信证明时,也可以提供财政部门认可 的政府采购专业担保机构出具的投标担保函。"
|
||
},
|
||
"依法缴纳税收和社会保障资金的证明材料": {
|
||
"(1)": {
|
||
"税务登记证(国税、地税或多证合一);": "",
|
||
"参加政府采购活动前一段时间内缴纳增值税、营业税和企业所得税的凭据;": "",
|
||
"社会保险登记证(或多证合一);": "",
|
||
"参加政府采购活动前一段时间内缴纳社会保险的凭据(专用收据或社会保险 缴纳清单)。": ""
|
||
},
|
||
"(2)": {
|
||
"参加政府采购活动前一段时间内缴纳税收的凭据;": "",
|
||
"参加政府采购活动前一段时间内缴纳社会保险的凭据(专用收据或社会保险 缴纳清单)。": ""
|
||
},
|
||
"(3)": "依法免税或不需要缴纳社会保险资金的投标人 提供其依法免税或不需要缴纳社会保险资金的相关证明文件。"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"具备履行合同所必需的设备和专业技术能力的证明材料": {
|
||
"提供具备足够数量的设施设备的证明材料;": "",
|
||
"提供具备足够数量的技术人员的证明材料。": ""
|
||
}
|
||
},
|
||
{
|
||
"参加政府采购活动前 3年内在经营活动中没有重大违法记录的书面声明": {
|
||
"应严格按照附件格式提交“参加政府采购活动前三年内在经营活动中没有重大 违法记录的书面声明函”;": "",
|
||
"政府采购法第二十二条第一款第五项所称重大违法记录,是指供应商因违法经 营受到刑事处罚或者责令停产停业、吊销许可证或者执照、较大数额罚款等行政处罚;": "",
|
||
"按照财政部《关于规范政府采购行政处罚有关问题的通知》的规定,各级人民 政府财政部门依法对参加政府采购活动的供应商作出的禁止参加政府采购活动等行政 处罚决定在全国范围内生效。": ""
|
||
}
|
||
},
|
||
"具备法律、行政法规规定的其他条件的证明材料:",
|
||
{
|
||
"1": "国家对生产和销售相关产品或提供相关服务有专门法律、行政法规规定的,则 必须提供取得国家有关主管部门行政许可的证明材料。",
|
||
"2": "未被列入“信用中国”网站(www.creditchina.gov.cn)信用服务栏失信被执行人、重 大税收违法案件当事人名单、政府采购严重违法失信行为记录名单和“中国政 府采购”网站(www.ccgp.gov.cn)政府采购严重违法失信行为记录名单,并提供 网页截图以证明;",
|
||
"3": "招标文件第一章“投标人资格要求”中有特殊要求的,投标人应提供其符合特 殊要求的证明材料或者情况说明;",
|
||
"4": "不符合联合体投标相关规定和要求的;",
|
||
"5": "投标人认为需提供的其它相关资格证明材料;",
|
||
"6": "资格证明文件正本应为清晰彩色影印件且加盖单位公章。"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
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)) |