gpt4 book ai didi

python - 关于使我的 JSON find-all-nested-occurrences 方法更清晰的建议

转载 作者:行者123 更新时间:2023-12-01 01:55:47 25 4
gpt4 key购买 nike

我正在解析未知的嵌套 json 对象,我不提前知道结构和深度。我正在尝试搜索它以找到一个值。这是我想出来的,但我觉得它很丑陋。有人可以让我知道如何让它看起来更Pythonic和更干净吗?

def find(d, key):
if isinstance(d, dict):
for k, v in d.iteritems():
try:
if key in str(v):
return 'found'
except:
continue
if isinstance(v, dict):
for key,value in v.iteritems():
try:
if key in str(value):
return "found"
except:
continue
if isinstance(v, dict):
find(v)
elif isinstance(v, list):
for x in v:
find(x)
if isinstance(d, list):
for x in d:
try:
if key in x:
return "found"
except:
continue
if isinstance(v, dict):
find(v)
elif isinstance(v, list):
for x in v:
find(x)
else:
if key in str(d):
return "found"
else:
return "Not Found"

最佳答案

使用鸭子类型通常更“Pythonic”;即,尝试搜索您的目标而不是使用 isinstance。请参阅What are the differences between type() and isinstance()?

但是,您对递归的需要使得有必要递归字典和列表元素的。 (你也想查字典的键吗?)

in 运算符可用于字符串、列表和字典,因此在测试成员资格时无需将字典与列表分开。假设您不想将目标作为子字符串进行测试,请按照前面的链接使用 isinstance(basestring)。要测试您的目标是否在字典的中,请测试 your_dictionary.values() 中的成员资格。请参阅Get key by value in dictionary

因为字典值可能是列表或字典,所以我仍然可以像你一样测试字典和列表类型,但我提到你可以用一条语句涵盖列表元素和字典键,因为你询问是否是 Pythonic ,并且在两种类型之间使用像 in 这样的重载操作器是 Python 的典型做法。

你使用递归的想法是必要的,但我不会定义名为 find 的函数,因为这是一个 Python 内置函数,你将(在某种程度上)影子并进行递归调用的可读性较差,因为其他程序员可能会错误地认为您正在调用内置函数(作为一种好的做法,您可能希望保留对内置函数的通常访问权限,以防您想调用它。)

要测试数字类型,请使用“numbers.Number”,如 How can I check if my python object is a number? 中所述。

此外,在 https://gist.github.com/douglasmiranda/5127251 上有一个针对您的问题的变体的解决方案。 。我在发帖之前就发现了这一点,因为评论中 ColdSpeed 的正则表达式建议让我怀疑我是否在引导您走上错误的道路。

所以类似

import numbers 
def recursively_search(object_from_json, target):
if isinstance(object_from_json, (basestring, numbers.Number)):
return object_from_json==target # the recursion base cases
elif isinstance(object_from_json, list):
for element in list:
if recursively_search(element, target):
return True # quit at first match
elif isinstance(object_from_json, dict):
if target in object_from_json:
return True # among the keys
else:
for value in object_from_json.values():
if recursively_search(value, target):
return True # quit upon finding first match
else:
print ("recursively_search() did not anticipate type ",type(object_from_json))
return False
return False # no match found among the list elements, dict keys, nor dict values

关于python - 关于使我的 JSON find-all-nested-occurrences 方法更清晰的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com