在Python嵌套字典中查找值,该字典包含字典、列表和字符串。

huangapple go评论72阅读模式
英文:

See if value exists in Python nested dict which contains dicts, lists, and strings

问题

我不确定是否有一些库可以处理这个问题,或者递归是正确的方法。我正在尝试编写一个递归函数,当我调用它时,它总是返回False。任何帮助都会受到欢迎。

item 最初是一个字典。
text 是要匹配的字符串。

def match(item, text):
    if item == text:
        return True
    if type(item) == list:
        for i in item:
            match(i, text)
    if type(item) == dict:
        for i in item.values():
            match(i, text)
    return False

我不太理解如何让它继续进行,例如当列表的第一个项目不匹配时。

英文:

I'm not sure if there is some library that handles this, or if recursion is the way to go. I am trying to write a recursion function, when I call it it always ends up returning False. Any help appreciated.

item starts out as a dict.
text is a string to match.

def match(item, text):
    if item == text:
        return True
    if type(item) == list:
        for i in item:
            match(i, text)
    if type(item) == dict:
        for i in item.values():
             match(i text)
    return False

I'm not quite grasping how to have it keep going when say the first item of a list is not a match.

答案1

得分: 4

当递归调用找到匹配时,您没有返回 True

def match(item, text):
    if item == text:
        return True
    if isinstance(item, (list, tuple)):
        return any(match(i, text) for i in item)
    if isinstance(item, dict):
        return any(match(i, text) for i in item.values())
    return False

您还应该使用 isinstance() 进行类型检查,以允许子类。

英文:

You're not returning True when the recursive call finds a match.

def match(item, text):
    if item == text:
        return True
    if isinstance(item, (list, tuple)):
        return any(match(i, text) for i in item)
    if isinstance(item, dict):
        return any(match(i, text) for i in item.values())
    return False

You should also use isinstance() for type checks, to allow for subclasses.

huangapple
  • 本文由 发表于 2023年3月4日 02:09:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/75630508.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定