代码之家  ›  专栏  ›  技术社区  ›  e-info128

如何检查多维字典中是否存在值?[闭门]

  •  0
  • e-info128  · 技术社区  · 7 年前

    有一个与主机和ip地址关联的多维字典,例如:

    items = {
        '10.0.0.1': [
            { 'host': 'abc.com', 'record_type': 'a', ... },
            { 'host': 'www.abc.com', 'record_type': 'cname', ... }
        ]
    }
    

    我有一个新的主机和ip地址要添加到阵列中,但是,如何检查是否存在以防止重复?,示例:需要插入 www.abc.com 10.0.0.1 但是没有 cname ,不能复制要使用的对象 in 在一个 if 无记录的条件类型 cname .

    使用lambda?但是如果有主机和ip地址,如何尝试使用lambda获取对象呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Richard Inglis    7 年前

    编辑:

    从您下面的评论来看,您似乎正在尝试存储一组 host 记录,唯一键入 ip hostname .

    您应该考虑将其存储在两层字典中,如下所示:

    items = {
        '10.0.0.1': {
            'abc.com': {'record_type': 'a', ... },
            'www.abc.com': {'record_type': 'cname', ... }
        },
        '10.0.0.2': {
            'xyz.com': {'record_type': 'a', ... },
            'www.xyz.com': {'record_type': 'cname', ... }
        }
    }
    

    然后,您可以使用以下两个键值轻松访问任何项目:

    def item_exists(ip, hostname):
        return ip in items.keys() and hostname in items[ip].keys()
    
    def get_item(ip, hostname):
        return items[ip][hostname] if item_exists(ip, hostname) else None
    
    def add_or_replace_item(ip, hostname, item):
        if ip not in items.keys():
            items[ip] = {}
        items[ip][hostname] = item
    
    def add_item_if_not_exists(ip, hostname, item):
        if not item_exists(ip, hostname):
            add_or_replace_item(ip, hostname, item)