2017-07-25 4 views
1

J'ai utilisé des tableaux imbriqués analysés à partir d'un fichier json. Cela finit par donner une ligne gigantesque chaque fois que j'essaie d'accéder aux valeurs dans les données. Disons que j'ai un tableau imbriqué dans les données var, quand j'essaie d'atteindre les valeurs les plus profondes, je dois respecter la limite de 80 caractères. Tout ce que je veux faire, c'est lire ou modifier la valeur.Quel serait le moyen le plus optimisé pour accéder aux valeurs dans un tableau imbriqué tout en respectant pep8?

self.data["name1"]["name2"][varWithNumber][varWithNumber2][varWithNumber3] 

Maintenant, je pensais à deux solutions possibles que je pourrais utiliser:

1- diviser en utilisant vars temporaires et reasign ensuite aux données une fois que je suis fait ex:

tempData=self.data["name1"]["name2"][varWithNumber] 
tempData[varWithNumber2][varWithNumber3]+=1 
self.data["name1"]["name2"][varWithNumber]=tempData 

Je suppose que cette solution utiliserait pas mal de ressources de toute la mémoire copiée.

2- Utilisez la fonction exec mis en œuvre en python et diviser la chaîne sur plusieurs lignes:

exec ('self.data'+ 
     '["name1"]'+ 
     '["name2"]'+ 
     '[varWithNumber]'+ 
     '[varWithNumber2]'+ 
     '[varWithNumber3]+=1') 

Je ne sais pas comment optimiser est la fonction exec. Quelle serait la façon la plus pythonique/optimisée de faire cela? Existe-t-il une autre/meilleure façon d'atteindre l'objectif tout en respectant le pep8?

+2

La façon dont je le vois, est que si vous exécutez quelque chose comme flake8 ou similaire, et les choses passent, vous êtes bien. Au-delà de ça, tout sera affaire d'opinion. – idjaw

Répondre

1

(peu long pour un commentaire) Vous n'avez pas besoin exec de le faire ... vous pouvez utiliser l'opérateur de continuation:

self.data["name1"]\ 
     ["name2"]\ 
     [varWithNumber]\ 
     [varWithNumber2]\ 
     [varWithNumber3] 

Démo:

In [635]: x = [[[[1, 2, 3]]]] 

In [636]: x[0]\ 
    ...: [0]\ 
    ...: [0]\ 
    ...: [0] 
Out[636]: 1 

Cela semble la façon la plus simple et la plus propre de le faire. N'utilisez pas exec à moins d'y être obligé.

En fait, ne l'utilisez pas, jamais.


Dans certains cas, en gardant une référence à un sous dict fonctionne si vous êtes visiter fréquemment encore et encore cette partie de votre structure de données. Il s'agit de décider quelle est la meilleure solution à appliquer compte tenu de la situation et des circonstances.

+0

Bien! Je savais que cela existait dans batch et cmd, mais pour une raison quelconque, je pensais que cela n'existait pas en python. Je suis sûr que c'est la meilleure et la plus simple façon de le faire. Je vous remercie :)! –

+1

@AlexandreMercierAubin La plupart du temps, cela améliore la lisibilité sans recourir à des tactiques douteuses comme 'exec'.Mais comme l'a dit idjaw, c'est une question d'opinion et ce qui convient le mieux à la situation. Faites ce que vous sentez le mieux tant que vous confirmez à PEP. –

1

Vous êtes sur la bonne voie avec votre première option, et ce n'est pas aussi intensif en mémoire que vous pourriez le penser. La plupart des choses en Python sont des références à des endroits dans la mémoire, donc disons que nous avons cette blob JSON (dict en python):

test = { 
    "name1": { 
     "name2": { 
      "foo": { 
       "count": 1, 
       "color": "red" 
      } 
     } 
    } 
} 

Maintenant, si vous vouliez changer les deux parties de cette imbriquée clé « foo », vous pourriez d'abord faire une référence à avec:

foo_ref = test['name1']['name2']['foo'] 

Ensuite, il est très simple à un peu

foo_ref['count'] += 1 
foo_ref['color'] = 'green'