巨蟒3
需要通过对数据应用规则来查找articleid
给定一组JSON格式的规则,其中包括文章ID和相应的属性规则。
例如:rules.json
{
"rules": [
{
"articleId": "art1",
"properties_rule": [
{
"condition": "EQ",
"logicalOperator": "AND",
"propertyId": 487,
"value": "aaaa"
},
{
"condition": "EQ",
"logicalOperator": "",
"propertyId": 487,
"value": "zzzz"
}
],
},
{
"articleId": "art2",
"properties_rule": [
{
"condition": "GTE",
"logicalOperator": "AND",
"propertyId": 487,
"value": "bbbb"
},
{
"condition": "LTE",
"logicalOperator": "",
"propertyId": 487,
"value": "eeee"
}
],
},
{
"articleId": "art3",
"properties_rule": [
{
"condition": "GTE",
"logicalOperator": "",
"propertyId": 487,
"value": "ffff"
}
],
}
]
}
Qs以及JSON格式的一组数据,其中包括某些属性的值。data.json
{
"data": {
"1": {
"properties_values": [
{
"value": {
"property_id": 487,
"property_value": "aaaa",
"response_id": 1
}
}
]
},
"2": {
"properties_values": [
{
"value": {
"property_id": 487,
"property_value": "bbbb",
"response_id": 2
}
}
]
},
"3": {
"properties_values": [
{
"value": {
"property_id": 487,
"property_value": "eeee",
"response_id": 3
}
}
]
}
}
}
任务是对数据应用规则并确定与规则匹配的文章ID。
如何使用提供的规则和数据JSON,根据规则JSON的“properties_rule”数组中指定的条件,确定“data”JSON中每个条目对应的“articleId”?“data”JSON中的“property_id”字段对应于“rules”JSON中的“propertyId”字段,并且“数据”JSON中的“属性值”字段对应于“规则”JSON中的“值”字段。
尝试此方法解决此问题,但不喜欢这么多for循环
要根据rules JSON的“properties_rule”数组中指定的条件确定“data”JSON中每个条目对应的“articleId”,我们可以在Python中执行以下步骤:
1.使用json模块将规则和数据JSON加载到Python字典中。
1.循环遍历“data”JSON中的每个条目。
1.对于每个条目,循环遍历“rules”JSON,根据“properties_rule”数组中指定的条件查找匹配的文章ID。
1.对于每个规则,循环遍历数据条目中的“properties_values”数组以查找匹配的属性ID。
1.如果找到匹配的属性ID,请检查属性值是否满足规则中指定的条件。如果不满足条件,请转到下一个规则。
1.如果满足所有条件,则返回与规则关联的文章ID。
1.如果找不到匹配的项目ID,则返回默认值或引发错误。
以下是实现此逻辑的示例代码:
import json
# Load the rules and data JSON files into memory
with open('rules.json', 'r') as f:
rules_data = json.load(f)
rules = rules_data['rules']
with open('data.json', 'r') as f:
data = json.load(f)
data = data['data']
# Loop through each rule and check if it matches the data
for rule in rules:
properties_rule = rule['properties_rule']
articleId = rule['articleId']
# Check if all the conditions in the properties_rule array are satisfied
matched = True
for prop_rule in properties_rule:
propertyId = prop_rule['propertyId']
value = prop_rule['value']
condition = prop_rule['condition']
# Check if any of the survey responses match the condition
response_matched = False
for key, value_dict in data.items():
properties_value = value_dict['properties_value']
for prop_value in properties_value:
survey_response = prop_value['survey_response']
if survey_response['property_id'] == propertyId:
property_value = survey_response['property_value']
if condition == 'EQ' and property_value == value:
response_matched = True
elif condition == 'GTE' and property_value >= value:
response_matched = True
elif condition == 'LTE' and property_value <= value:
response_matched = True
# If none of the survey responses match the condition, set matched to False
if not response_matched:
matched = False
break
# If all the conditions are satisfied, return the articleId of that rule
if matched:
print("Article ID: ", articleId)
break
# If none of the rules match the data, return a default articleId
if not matched:
print("Default Article ID")
1条答案
按热度按时间qyswt5oh1#
您可以将每个
properties_rule
列表转换为函数或lambda
表达式(附带一个propertyId
列表以提取参数,并返回一个articleId
)。注意,使用
eval
通常是considered unsafe,但我认为在这种情况下是可以的,因为您确切地知道lStr1+lStr2
中可以包含什么(pr['value']
除外,但它来自解析的JSON,因此它不是表达式)。如果用于您问题中的
rules.json
示例,那么
rules_list
实际上等于[You'仍然需要循环
data
中每个properties_values
的每个规则,但这样您只需循环每个properties_rule
字典一次,然后就可以使用创建的lambda
表达式了。]由于您需要
property_value
(对应于property_id
)作为lambda
表达式的参数,因此您可能还需要使用函数根据property_id
查找data
值的property_value
:现在,您可以像这样循环
data
对于示例
data.json
和rules.json
,这会在所有3行上打印Article ID: art3
,但这并不奇怪,因为art1
和art2
规则是不可能的,除非p1
和p2
不同[它们不可能,因为两个规则的prop_ids
都是[487,487]
]。