1
votes

Transformez une liste de listes en un dictionnaire qui peut être converti en Json

J'ai une liste de listes en Python que j'ai besoin de convertir en dictionnaire ou json, ma liste ressemble à ceci:

{
    "user1": {
        "Administration": 100
        },
    "user2": {
        "Development": 170,
        "Testing": 30
    }, 
    "user3": {
        "Administration": 95,
        "Development": 400,
        "Testing": 200
    }
}

J'ai besoin de ceci pour ressembler à ceci:

[
 ['user1', 'Administration', 100],
 ['user2', 'Development', 170],
 ['user2', 'Testing', 30],
 ['user3', 'Administration', 95],
 ['user3', 'Development', 400],
 ['user3', 'Testing', 200]
]

Quelle est la meilleure façon de procéder? ma boucle actuelle écrase la clé, j'en ai besoin pour ajouter les attributs respectifs si l'utilisateur existe déjà.

Merci!


2 commentaires

Veuillez montrer votre effort


Pouvons-nous voir le code actuel?


5 Réponses :


2
votes

Utilisation de dict.setdefault

{'user1': {'Administration': 100},
 'user2': {'Development': 170, 'Testing': 30},
 'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}

Sortie:

data = [
 ['user1', 'Administration', 100],
 ['user2', 'Development', 170],
 ['user2', 'Testing', 30],
 ['user3', 'Administration', 95],
 ['user3', 'Development', 400],
 ['user3', 'Testing', 200]
]

result = {}
for k, sub_k, v in data:
    result.setdefault(k, {}).update({sub_k: v})


1 commentaires

@kuro. Merci de ne pas voir ça



2
votes

Approche courte avec l'objet collections.defaultdict :

{'user1': {'Administration': 100},
 'user2': {'Development': 170, 'Testing': 30},
 'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}

La sortie:

from collections import defaultdict

# data (your initial list of lists)

d = defaultdict(dict)
for uname, k, v in data:
    d[uname][k] = v

print(dict(d))


0 commentaires

0
votes
# import defaultdict to initialize by dictionary
from collections import defaultdict

# our data
ls = [ 
  ['user1', 'Administration', 100], 
  ['user2', 'Development', 170], 
  ['user2', 'Testing', 30], 
  ['user3', 'Administration', 95], 
  ['user3', 'Development', 400], 
  ['user3', 'Testing', 200] 
]

# create final response
d = defaultdict(dict)

# iterate and fill the result
for u, k, v in ls:
   d[u][k] = v

# see if it's correct
print(d)
defaultdict(dict,
  {'user1': {'Administration': 100},
   'user2': {'Development': 170, 'Testing': 30},
   'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}})

1 commentaires

Merci beaucoup à vous tous! cette solution est tellement plus simple que la façon dont j'essayais de le faire.



0
votes

Pour une compréhension plus simple

{'user2': {'Testing': 30}, 'user3': {'Testing': 200}, 'user1': {'Administration': 100}}

user_list = [
     ['user1', 'Administration', 100],
     ['user2', 'Development', 170],
     ['user2', 'Testing', 30],
     ['user3', 'Administration', 95],
     ['user3', 'Development', 400],
     ['user3', 'Testing', 200]
    ]
user_dict={}
for user in user_list:
    user_dict[user[0]]={user[1]:user[2]}
print(user_dict)


0 commentaires

0
votes

Vous pouvez également utiliser itertools.groupby:

{'user1': {'Administration': 100}, 'user2': {'Development': 170, 'Testing': 30}, 'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}

Output:

from itertools import groupby as gb
d = [['user1', 'Administration', 100], ['user2', 'Development', 170], ['user2', 'Testing', 30], ['user3', 'Administration', 95], ['user3', 'Development', 400], ['user3', 'Testing', 200]]
result = {a:{c:d for _, c, d in b} for a, b in gb(d, key=lambda x:x[0])}


0 commentaires