208 votes

Comment créer des dictées imbriquées en Python ?

J'ai deux fichiers CSV : "Données" et "Cartographie" :

  • Le fichier 'Mapping' comporte 4 colonnes : Device_Name , GDN , Device_Type et Device_OS . Les quatre colonnes sont remplies.
  • Le fichier "Data" comporte les mêmes colonnes, avec les éléments suivants Device_Name et les trois autres colonnes sont vides.
  • Je veux que mon code Python ouvre les deux fichiers et pour chaque Device_Name dans le fichier de données, faire correspondre son GDN , Device_Type et Device_OS du fichier Mapping.

Je sais comment utiliser dict lorsque seulement 2 colonnes sont présentes (1 est nécessaire pour être mappée) mais je ne sais pas comment accomplir ceci lorsque 3 colonnes doivent être mappées.

Voici le code à l'aide duquel j'ai essayé de réaliser le mapping de Device_Type :

x = dict([])
with open("Pricing Mapping_2013-04-22.csv", "rb") as in_file1:
    file_map = csv.reader(in_file1, delimiter=',')
    for row in file_map:
       typemap = [row[0],row[2]]
       x.append(typemap)

with open("Pricing_Updated_Cleaned.csv", "rb") as in_file2, open("Data Scraper_GDN.csv", "wb") as out_file:
    writer = csv.writer(out_file, delimiter=',')
    for row in csv.reader(in_file2, delimiter=','):
         try:
              row[27] = x[row[11]]
         except KeyError:
              row[27] = ""
         writer.writerow(row)

Il retourne Attribute Error .

Après quelques recherches, je pense que je dois créer un dict imbriqué, mais je n'ai aucune idée de la manière de le faire.

0voto

conmak Points 396

Si vous voulez créer un dictionnaire imbriqué à partir d'une liste (de longueur arbitraire) pour un chemin et exécuter une fonction sur un élément qui peut exister à la fin du chemin, cette petite fonction récursive pratique est très utile :

def ensure_path(data, path, default=None, default_func=lambda x: x):
    """
    Function:

    - Ensures a path exists within a nested dictionary

    Requires:

    - `data`:
        - Type: dict
        - What: A dictionary to check if the path exists
    - `path`:
        - Type: list of strs
        - What: The path to check

    Optional:

    - `default`:
        - Type: any
        - What: The default item to add to a path that does not yet exist
        - Default: None

    - `default_func`:
        - Type: function
        - What: A single input function that takes in the current path item (or default) and adjusts it
        - Default: `lambda x: x` # Returns the value in the dict or the default value if none was present
    """
    if len(path)>1:
        if path[0] not in data:
            data[path[0]]={}
        data[path[0]]=ensure_path(data=data[path[0]], path=path[1:], default=default, default_func=default_func)
    else:
        if path[0] not in data:
            data[path[0]]=default
        data[path[0]]=default_func(data[path[0]])
    return data

Exemple :

data={'a':{'b':1}}
ensure_path(data=data, path=['a','c'], default=[1])
print(data) #=> {'a':{'b':1, 'c':[1]}}
ensure_path(data=data, path=['a','c'], default=[1], default_func=lambda x:x+[2])
print(data) #=> {'a': {'b': 1, 'c': [1, 2]}}

0voto

Shah Vipul Points 156

Cette chose est une liste vide imbriquée à partir de laquelle je vais ajouter des données à un dict vide.

ls = [['a','a1','a2','a3'],['b','b1','b2','b3'],['c','c1','c2','c3'], 
['d','d1','d2','d3']]

cela signifie créer quatre dict vides à l'intérieur de data_dict

data_dict = {f'dict{i}':{} for i in range(4)}
for i in range(4):
    upd_dict = {'val' : ls[i][0], 'val1' : ls[i][1],'val2' : ls[i][2],'val3' : ls[i][3]}

    data_dict[f'dict{i}'].update(upd_dict)

print(data_dict)

Le résultat

{ 'dict0' : {'val' : 'a', 'val1' : 'a1', 'val2' : 'a2', 'val3' : 'a3'}, 'dict1' : {'val' : 'b', 'val1' : 'b1', 'val2' : 'b2', 'val3' : 'b3'}, 'dict2' : { 'val' : 'c', 'val1' : 'c1', 'val2' : 'c2', 'val3' : 'c3'}, 'dict3' : {'val' : 'd', 'val1' : 'd1', 'val2' : 'd2', 'val3' : 'd3'}}

0voto

Keerthi Reddy Points 45
#in jupyter
import sys
!conda install -c conda-forge --yes --prefix {sys.prefix} nested_dict 
import nested_dict as nd
d = nd.nested_dict()

On peut maintenant utiliser 'd' pour stocker les paires clé-valeur imbriquées.

0voto

Dinesh Tamang Points 9
travel_log = {
    "France" : {"cities_visited" : ["paris", "lille", "dijon"], "total_visits" : 10},
    "india" : {"cities_visited" : ["Mumbai", "delhi", "surat",], "total_visits" : 12}
}

0voto

edd313 Points 33

Vous pouvez initialiser un NestedDict et ensuite attribuer des valeurs aux nouvelles clés.

from ndicts.ndicts import NestedDict

nd = NestedDict()
nd["level1", "level2", "level3"] = 0

>>> nd
NestedDict({'level1': {'level2': {'level3': 0}}})

ndicts est sur Pypi

pip install ndicts

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X