Skip to main content

Dict type that makes it easier to work with deeply nested dicts.

Project description

Dictionary types that make it easier to work trees of nested dictionaries.

Consider a nested regular dictionaries:

d = {
    "en": {
        "gb": "English (United Kingdom)",
        "us": "English (United States)",
        "ca": "English (Canada)",
        "za": "English (South Africa)",
    },
    "no": {
        "nb": "Norwegian (Bokmål)",
        "nn": "Norwegian (Nynorsk)",
    },
    "fr": {
        "be": "French (Belgium)",
        "ca": "French (Canada)",
        "fr": "French (Standard)",
        "ch": "French (Switzerland)",
    }
}

from which we can construct a DeepDict:

>>> from dendrodict import DeepDict
>>> languages = DeepDict(d)

Nested dictionaries can be accessed with single application of the square brackets get-item operator:

>>> languages["fr", "ca"]
'French (Canada)'

or by using a tuple as a key:

>>> languages[("no", "nb")]
'Norwegian (Bokmål)'

The tuple key can also be used with other dictionary methods, such as get():

>>> languages.get(("en", "us"))
'English (United States)'

It’s still possible index the inner dictionary levels:

>>> languages["en"]
DeepDict(
    {
        'gb': 'English (United Kingdom)',
        'us': 'English (United States)',
        'ca': 'English (Canada)',
        'za': 'English (South Africa)'
    }
)

which means that separate lookup operations are still supported:

>>> languages["en"]["za"]
'English (South Africa)'

The tuple key form can also be used on construction, so flat dictionaries with tuple keys will be expanded into nested dictionaries. Consider the following single-level mapping of tuple keys to values:

blocks = {
    ("mineral", "sandstone", "block"): "Sandstone",
    ("mineral", "sandstone", "chiseled"): "Sandstone (Chiseled)",
    ("mineral", "cobblestone", "block"): "Cobblestone",
    ("mineral", "cobblestone", "slab"): "Cobblestone (Slab)",
    ("mineral", "gold", "ore"): "Gold Ore",
    ("wood", "birch", "block"): "Birch",
    ("wood", "birch", "slab"): "Birch-Wood Slab",
    ("wood", "oak", "block"): "Oak",
    ("wood", "oak", "plank"): "Wooden Plank (Oak)",
}

Created a DeepDict from this, gives a three-level structure:

>>> minecraft = DeepDict(blocks)

which we can see by converted back to dictionaries using the to_dict() method:

>>> minecraft.to_dict()
{'mineral': {
    'cobblestone': {
        'block': 'Cobblestone',
        'slab': 'Cobblestone (Slab)'
    },
    'gold': {
        'ore': 'Gold Ore'
    },
    'sandstone': {
        'block': 'Sandstone',
        'chiseled': 'Sandstone (Chiseled)'
    }
},
'wood': {
    'birch': {
        'block': 'Birch',
        'slab': 'Birch-Wood Slab'
    },
    'oak': {
        'block': 'Oak',
        'plank': 'Wooden Plank (Oak)'}
    }
}

Particularly when dealing with configuration data, it can be useful to be able to use dotted names for access to nested items. Use DottedDeepDict for this:

from dendrodict import DottedDeepDict

displays = DottedDeepDict(
    {
        "resolution": {
            "vga": {
                "width": 640,
                "height": 480,
            },
            "wxga": {
                "width": 1280,
                "height": 800,
            },
            "wqhd": {
                "width": 2560,
                "height": 1440,
            },
        }
    }
)

Dotted name syntax can be used for lookup:

>>> displays["resolution.vga.width"]
640

or for assignment at arbitrary levels:

>>> displays["resolution.1080p.width"] = 1920
>>> displays["resolution.1080p.height"] = 1080

Shallower levels are still available individually:

>>> displays["resolution.1080p"]
DottedDeepDict({'width': 1920, 'height': 1080})

and can be converted back to regular dictionaries:

>>> displays["resolution.wqhd"].to_dict()
{'width': 2560, 'height': 1440}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

dendrodict-1.0.4-py3-none-any.whl (4.7 kB view details)

Uploaded Python 3

File details

Details for the file dendrodict-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: dendrodict-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 4.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for dendrodict-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 ab42831092433a2eef0982478e323c9ce4eb984ce64b4d78680decdf6cee605f
MD5 d590bb891bb978ebc396a7018277c73b
BLAKE2b-256 28ad8cb8d8273fe70bc7e00bbd94b5b47777085a5da18e56281f93f0392d964f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page