Python 在列表和词典列表中搜索值
我试图编写一个代码,检查包含字典和/或列表的列表中是否存在特定值,并返回True或False 注意:我无法更改数据的结构 我设法拥有此功能,该功能为我拥有的当前数据类型执行任务:Python 在列表和词典列表中搜索值,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我试图编写一个代码,检查包含字典和/或列表的列表中是否存在特定值,并返回True或False 注意:我无法更改数据的结构 我设法拥有此功能,该功能为我拥有的当前数据类型执行任务: def search_value_list_dic(value, list_dic): if any(isinstance(el, list) for el in list_dic): number_lists = len(list_dic) list_or = []
def search_value_list_dic(value, list_dic):
if any(isinstance(el, list) for el in list_dic):
number_lists = len(list_dic)
list_or = []
for i in range(number_lists):
if value in list_dic[i]:
list_or.append('true')
else:
list_or.append('false')
if 'true' in list_or: return True
else: return False
if value in list_dic:
return True
if value not in list_dic:
return False
我知道这不是最有效的方法。
有人对如何改进有什么想法吗
我还想让它更通用,基本上是搜索列表上的每个项目,即使它有列表上的列表,等等
数据结构示例:
[{'id': 'BuMnLoadRequestCfgBufferRequestOnHysteresis', 'view_id': 122, 'label': {'key': 'BUMN_LOAD_REQUEST_CFGBUFFERREQUESTONHYSTERESIS', 'en': 'Hysteresis to start buffer cylinder loading', 'de': 'Einschalthysterese Puffer'}, 'range': None, 'testing_conditions': [[{'ordName': 'BuMnLoadRequestMnIsActive', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.mnIsActive.1 == true', 'condition_testing': 'BuMn.load.request.mnIsActive.1 == 1'}, 'OR', {'ordName': 'BuMnLoadHydMnIsFlowControlActive', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.hyd.mnIsFlowControlActive.1 == true', 'condition_testing': 'BuMn.load.hyd.mnIsFlowControlActive.1 == 1'}], {'ordName': 'BuMnLoadRequestInAHSHydraulic', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.inAHSHydraulic.4 == BUFFER', 'condition_testing': 'BuMn.load.request.inAHSHydraulic.4 == 1'}], 'type': 'customkeypadonly_text_linear', 'user_level': 3}, {'id': 'BuMnLoadRequestCfgBufferRequestOffHysteresis', 'view_id': 122, 'label': {'key': 'BUMN_LOAD_REQUEST_CFGBUFFERREQUESTOFFHYSTERESIS', 'en': 'Hysteresis to stop buffer cylinder loading', 'de': 'Ausschalthysterese Puffer'}, 'range': None, 'testing_conditions': [[{'ordName': 'BuMnLoadRequestMnIsActive', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.mnIsActive.1 == true', 'condition_testing': 'BuMn.load.request.mnIsActive.1 == 1'}, 'OR', {'ordName': 'BuMnLoadHydMnIsFlowControlActive', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.hyd.mnIsFlowControlActive.1 == true', 'condition_testing': 'BuMn.load.hyd.mnIsFlowControlActive.1 == 1'}], {'ordName': 'BuMnLoadRequestInAHSHydraulic', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.inAHSHydraulic.4 == BUFFER', 'condition_testing': 'BuMn.load.request.inAHSHydraulic.4 == 1'}], 'type': 'customkeypadonly_text_linear', 'user_level': 3}, {'id': 'BuMnLoadRequestCfgBufferAHSOffset', 'view_id': 122, 'label': {'key': 'BUMN_LOAD_REQUEST_CFGBUFFERAHSOFFSET', 'en': 'Buffer to heat source set temperature increase', 'de': 'Temperaturanhebung Puffer zu Mischer/Wärmeerzeuger'}, 'range': None, 'testing_conditions': [{'ordName': 'BuMnLoadRequestMnIsActive', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.mnIsActive.1 == true', 'condition_testing': 'BuMn.load.request.mnIsActive.1 == 1'}, {'ordName': 'BuMnLoadRequestInAHSHydraulic', 'ordValue': '1', 'type': 'single', 'condition': 'BuMn.load.request.inAHSHydraulic.4 == BUFFER', 'condition_testing': 'BuMn.load.request.inAHSHydraulic.4 == 1'}], 'type': 'customkeypadonly_text_linear', 'user_level': 2}]
以及我要搜索的值:或
谢谢这里我实现了一个简单的函数containsx,如果x中某处包含val,则返回True,否则返回False。该函数递归调用自身,在任何深度的所有子结构中进行搜索 在字典内搜索时,我只搜索内部值。要同时搜索内部键,请将代码containsv、val替换为containsv、val或containsk、val 接下来的代码从这个函数开始,然后您的示例x数据结构如下,我将其重新格式化为漂亮的,在代码的末尾有一些测试
您必须递归搜索。像这样的 从输入任何 数据=[ { id:BUMNLOADREQUESTCFGBUFFERREQUESTONHISERE, 视图id:122, 标签:{ 关键字:BUMN\u LOAD\u REQUEST\u CFGBufferrequestOnSystem, en:开始缓冲气缸加载的滞后, de:Einschalthysterese Puffer, }, 范围:无, 测试条件:[ [ { ordName:BumnoAdrenquesTmnisActive, 价值:1, 类型:单, 条件:BuMn.load.request.mnIsActive.1==true, 条件_测试:BuMn.load.request.mnIsActive.1==1, }, 或 { ordName:bumnoladhydmnisflowcontrolactive, 价值:1, 类型:单, 条件:燃烧负荷液压流量控制激活。1==真, 条件测试:燃烧负荷液压流量控制激活。1==1, }, ], { 订单名称:Bumnolandrenquestinahshraulic, 价值:1, 类型:单, 条件:BuMn.load.request.inAHSHydraulic.4==缓冲区, 条件_测试:燃烧负荷请求inAHSHydraulic.4==1, }, ], 类型:customkeypadonly\u text\u linear, 用户级别:3, }, { id:BUMNLOADREQUESTCFGBUFFERREQUESTOFF滞后, 视图id:122, 标签:{ 键:BUMN\u LOAD\u REQUEST\u CFGBufferRequestOff滞后, en:停止缓冲油缸加载的滞后, 德:奥斯沙尔塔斯泰雷斯·帕弗, }, 范围:无, 测试条件:[ [ { ordName:BumnoAdrenquesTmnisActive, 价值:1, 类型:单, 条件:BuMn.load.request.mnIsActive.1==true, 条件_测试:BuMn.load.request.mnIsActive.1==1, }, 或 { ordName:bumnoladhydmnisflowcontrolactive, 价值:1, 类型:单, 条件:燃烧负荷液压流量控制激活。1==真, 条件测试:燃烧负荷液压流量控制激活。1==1, }, ], { 订单名称:Bumnolandrenquestinahshraulic, 价值:1, 类型:单, 条件:BuMn.load.request.inAHSHydraulic.4==缓冲区, 条件_测试:燃烧负荷请求inAHSHydraulic.4==1, }, ], 类型:customkeypadonly\u text\u linear, 用户级别:3, }, { id:BuMnLoadRequestCfgBufferAHSOffset, 视图id:122, 标签:{ 键:BUMN\u加载请求\u CFGBUFFERAHSOFFSET, en:缓冲区至热源设定温度升高, 德:温度河豚, }, 范围:无, 测试条件:[ { ordName:BumnoAdrenquesTmnisActive, 价值:1, 类型:单, 条件:BuMn.load.request.mnIsActive.1==true, 条件_测试:BuMn.load.request.mnIsActive.1==1, }, { 订单名称:Bumnolandrenquestinahshraulic, 价值:1, 类型:单, 条件:BuMn.load.request.inAHSHydraulic.4==缓冲区, 康迪特 ion_测试:BuMn.load.request.inAHSHydraulic.4==1, }, ], 类型:customkeypadonly\u text\u linear, 用户级别:2, }, ] def searchobj:Any,string_to_find:str->bool: 递归搜索对象以查找特定字符串。 Args: obj Any:要分析的对象 string_to_find str:要查找的字符串 返回: 布尔:是否找到字符串 将字典视为值列表 如果是安装对象,请说明: obj=列表obj.values 递归列表中的每个元素 如果isinstanceobj、列表、元组: 对于obj中的元素: 如果element==string\u to\u find或searchelement,string\u to\u find: 返回真值 默认情况下找不到 返回错误 found=搜索数据,bumnoadrequestinahshydraulic 找到printfString“bumnoladrequestinahshydraulic:{found} found=搜索数据,或 printfString'或'found:{found} found=搜索数据,MYRANDOMSTRING 找到printfString“MYRANDOMSTRING:{found} 输出: 找到字符串“bumnoadrequestinahshydraulic”:True 找到字符串“或”:True 找到字符串“MYRANDOMSTRING”:False
请提供一些样本数据,以便我们自己尝试。此外,如果您处理的是字典,那么您要查找的值应该是键、值或其中的任何一个。您应该转到代码检查,而不是堆栈溢出以进行代码优化。@sunnytown是的,对不起,我已经更新了问题,并提供了我正在使用的数据结构示例。我要搜索的值是:或。@Mathieu抱歉不知道,下次我会这样做:@Ricky我在中实现了我自己的搜索函数变体,请看一看!这是超干净的,正是我想要的!非常感谢你,真的很喜欢你的方式!谢谢,这很好用!真的很有帮助!我得到的两个答案都令人惊讶。@Ricky欢迎!:
def contains(x, val):
if isinstance(x, list):
for e in x:
if contains(e, val):
return True
elif isinstance(x, dict):
for k, v in x.items():
if contains(v, val):
return True
elif x == val:
return True
return False
x = [
{
"id": "BuMnLoadRequestCfgBufferRequestOnHysteresis",
"view_id": 122,
"label": {
"key": "BUMN_LOAD_REQUEST_CFGBUFFERREQUESTONHYSTERESIS",
"en": "Hysteresis to start buffer cylinder loading",
"de": "Einschalthysterese Puffer",
},
"range": None,
"testing_conditions": [
[
{
"ordName": "BuMnLoadRequestMnIsActive",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.mnIsActive.1 == true",
"condition_testing": "BuMn.load.request.mnIsActive.1 == 1",
},
"OR",
{
"ordName": "BuMnLoadHydMnIsFlowControlActive",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.hyd.mnIsFlowControlActive.1 == true",
"condition_testing": "BuMn.load.hyd.mnIsFlowControlActive.1 == 1",
},
],
{
"ordName": "BuMnLoadRequestInAHSHydraulic",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.inAHSHydraulic.4 == BUFFER",
"condition_testing": "BuMn.load.request.inAHSHydraulic.4 == 1",
},
],
"type": "customkeypadonly_text_linear",
"user_level": 3,
},
{
"id": "BuMnLoadRequestCfgBufferRequestOffHysteresis",
"view_id": 122,
"label": {
"key": "BUMN_LOAD_REQUEST_CFGBUFFERREQUESTOFFHYSTERESIS",
"en": "Hysteresis to stop buffer cylinder loading",
"de": "Ausschalthysterese Puffer",
},
"range": None,
"testing_conditions": [
[
{
"ordName": "BuMnLoadRequestMnIsActive",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.mnIsActive.1 == true",
"condition_testing": "BuMn.load.request.mnIsActive.1 == 1",
},
"OR",
{
"ordName": "BuMnLoadHydMnIsFlowControlActive",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.hyd.mnIsFlowControlActive.1 == true",
"condition_testing": "BuMn.load.hyd.mnIsFlowControlActive.1 == 1",
},
],
{
"ordName": "BuMnLoadRequestInAHSHydraulic",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.inAHSHydraulic.4 == BUFFER",
"condition_testing": "BuMn.load.request.inAHSHydraulic.4 == 1",
},
],
"type": "customkeypadonly_text_linear",
"user_level": 3,
},
{
"id": "BuMnLoadRequestCfgBufferAHSOffset",
"view_id": 122,
"label": {
"key": "BUMN_LOAD_REQUEST_CFGBUFFERAHSOFFSET",
"en": "Buffer to heat source set temperature increase",
"de": "Temperaturanhebung Puffer zu Mischer/Wärmeerzeuger",
},
"range": None,
"testing_conditions": [
{
"ordName": "BuMnLoadRequestMnIsActive",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.mnIsActive.1 == true",
"condition_testing": "BuMn.load.request.mnIsActive.1 == 1",
},
{
"ordName": "BuMnLoadRequestInAHSHydraulic",
"ordValue": "1",
"type": "single",
"condition": "BuMn.load.request.inAHSHydraulic.4 == BUFFER",
"condition_testing": "BuMn.load.request.inAHSHydraulic.4 == 1",
},
],
"type": "customkeypadonly_text_linear",
"user_level": 2,
},
]
assert contains(x, 'OR')
assert contains(x, 'BuMnLoadRequestMnIsActive')
assert not contains(x, 'AND')