我花了很多时间搜索所有“我的函数不返回”和“嵌套字典搜索”消息,但没有一条消息特别适用,也没有解决我的问题。
我创建了一个函数来搜索嵌套字典并返回路径。这很好用!我可以从函数内部打印结果,但紧接在打印下方的 return 返回 None。也许我看它太久了,它可能就在我面前,但我只是看不出这里有什么问题。这是我的完整代码:
def search(v, searchterm, vid, path=(),):
if isinstance(v, dict):
for k, v2 in v.items():
p2 = path + ('{}'.format(k),)
search(v2, searchterm, vid, p2)
else:
if searchterm in v:
a = {}
a[0] = path
a[1] = v[vid]
print(a)
return(a)
def main():
mydata = {}
mydata[1] = {}
mydata[1][1] = 'data-1-1','reason-1-1','notes-1-1'
mydata[1][2] = 'data-1-2','reason-1-2','notes-1-2'
mydata[1][3] = 'data-1-3','reason-1-3','notes-1-3'
mydata[1][4] = 'data-1-4','reason-1-4','notes-1-4'
mydata[1][5] = 'data-1-5','reason-1-5','notes-1-5'
mydata[1][6] = 'data-1-6','reason-1-6','notes-1-6'
mydata[1][7] = 'data-1-7','reason-1-7','notes-1-7'
mydata[1][8] = 'data-1-8','reason-1-8','notes-1-8'
mydata[1][9] = 'data-1-9','reason-1-9','notes-1-9'
mydata[1][10] = 'data-1-10','reason-1-10','notes-1-10'
mydata[2] = {}
mydata[2][1] = 'data-2-1','reason-2-1','notes-2-1'
mydata[2][2] = 'data-2-2','reason-2-2','notes-2-2'
mydata[2][3] = 'data-2-3','reason-2-3','notes-2-3'
mydata[2][4] = 'data-2-4','reason-2-4','notes-2-4'
mydata[2][5] = 'data-2-5','reason-2-5','notes-2-5'
mydata[2][6] = 'data-2-6','reason-2-6','notes-2-6'
mydata[2][7] = 'data-2-7','reason-2-7','notes-2-7'
mydata[2][8] = 'data-2-8','reason-2-8','notes-2-8'
mydata[2][9] = 'data-2-9','reason-2-9','notes-2-9'
mydata[2][10] = 'data-2-10','reason-2-10','notes-2-10'
b = search(mydata,'reason-2-4', 2)
print(b)
if __name__ == '__main__':
main()
结果:
{0: ('2', '4'), 1: 'notes-2-4'}
None
您可以看到函数内部的打印效果很好,但 main 的返回和打印返回 None。我已经使用 Python 编程几年了,编写了许多函数、类和方法并返回值,但这个让我卡住了。
请您参考如下方法:
您正在进行递归 调用,并且在嵌套调用中发出了print 语句。然而,search 的返回值没有被使用,这就是为什么它永远不会到达 main 函数的原因。
下面,我添加了一个被检查的 nested 变量,如果发现任何实际返回的内容。
def search(v, searchterm, vid, path=(),):
if isinstance(v, dict):
for k, v2 in v.items():
p2 = path + ('{}'.format(k),)
nested = search(v2, searchterm, vid, p2)
if nested:
# before, nothing was ever returned here
return nested
else:
if searchterm in v:
a = {}
a[0] = path
a[1] = v[vid]
print(a)
return(a)
不相关,但在这里您可以充分利用 python 强大的字典字面值
mydata = {
1: {
1: ('data-1-1', 'reason-1-1', 'notes-1-1'),
2: ('data-1-2', 'reason-1-2', 'notes-1-2')
2: {
1: ('data-2-1', 'reason-2-1', 'notes-2-1'),
2: ('data-2-2', 'reason-2-2', 'notes-2-2')
}
此外,如果您所有的字典键都是 int,您也可以使用 list。
