-2
votes

Convertir dict avec des tuples en json

J'ai l'entrée suivante:

ValueError: not enough values to unpack (expected 2, got 1)

Je veux le convertir en quelque chose comme:

[{'name': k, 'values': [(v1, v2)]} for k, [v1, v2] in input.items()]

J'ai essayé de faire quelque chose comme:

"name": "foo"
    "values": [
     {    
        "first":"aaa", 
        "last":"bbb"
     },
     { "first": "ccc",
       "last":"ddd
     }
    ],
"name": "buz"
    "values": [
     {    
        "first":"xxx", 
        "last":"yyy"
     }],
"name" : "bar
"values":[]

Mais obtenir cette erreur:

input =  {'foo': [('aaa', 'bbb'), ('ccc', 'ddd')], 'buz': [('xxx', 'yyy')], 'bar': [[]]})

Je pense que cela est dû au fait que dans certains cas, la liste des valeurs est vide


11 commentaires

Habituellement, vous pouvez simplement utiliser le module json pour sérialiser votre dict . Avez-vous essayé cela?


Le résultat souhaité n'est pas une valeur JSON. Vous ne pouvez pas utiliser les mêmes clés dans le même objet, vous avez besoin d'un tableau d'objets.


@JanChristophTerasa Ils veulent d'abord le réorganiser.


Vous décompressez la valeur de tous les éléments dict sous la forme [v1, v2] , mais il n'y en a pas toujours deux. Mais comme @JanChristophTerasa l'a dit: pourquoi faire cela vous-même et ne pas utiliser les bibliothèques standard?


@JanChristophTerasa Je suppose que vous voulez dire quelque chose comme json.dumps(res) oui, j'ai essayé mais cela me donnera quelque chose comme "buz":[["xxx","yyy"]] qui n'est pas ce que je cherche pour


@prune, la question concerne plus la réorganisation d'un dict que son transfert vers JSON.


Ah, mon mauvais, désolé.


Je ne comprends pas pourquoi le vote négatif @JanChristophTerasa


Pas mon vote négatif et peut-être pas le leur non plus; mais si le titre de votre question ne correspond pas à son contenu et que le contenu n'explique pas correctement comment la sortie attendue peut être dérivée de l'exemple d'entrée, quelqu'un pourrait voter contre (ou même marquer pour fermer comme "a besoin de détails ou de clarté") simplement pour ça. Cela devrait être facile à résoudre avec une modification rapide et améliorer vos chances d'obtenir des réponses adéquates à votre question réelle.


@tripleee j'ai essayé de mettre à jour le titre avec quelque chose de plus précis, si vous avez d'autres suggestions, veuillez les partager, merci


Veuillez modifier votre question pour clarifier ce que vous essayez de faire. S'il ne s'agit pas de créer un JSON, ne demandez pas de créer un JSON. Si vous voulez une sortie spécifique, veuillez ne pas demander "quelque chose comme" JSON / Python malformé et afficher du code "quelque chose comme" faisant autre chose - définissez clairement ce que vous attendez et ce que vous avez essayé pour y parvenir .


3 Réponses :


0
votes

Vous avez besoin de listes imbriquées:

input_data =  {'foo': [('aaa', 'bbb'), ('ccc', 'ddd')], 'buz': [('xxx', 'yyy')], 'bar': [[]]}

[{
    "name": key, 
    "values": [
        {"first": v[0], "last": v[1]} for v in value if v
    ]}
 for key, value in input_data.items()]


5 commentaires

Merci, mais j'ai eu `pour le premier, le dernier en valeur ValueError: pas assez de valeurs pour décompresser (attendu 2, obtenu 0)` Je pense que cela parce que parfois la valeur est vide


buz valeurs foo et buz sont une liste de tuples à 2 éléments. Pourquoi bar est-il une liste avec une liste vide?


J'ai mis à jour la réponse pour ignorer les valeurs vides.


BTW, n'utilisez pas input comme nom de variable, cela remplace la fonction input() .


Je l'ai réparé et testé.



0
votes

Smth comme ceci:

[{'name': 'foo', 'values': [{'first': 'aaa', 'last': 'bbb'}, {'first': 'ccc', 'last': 'ddd'}]}, {'name': 'buz', 'values': [{'first': 'xxx', 'last': 'yyy'}]}, {'name': 'bar', 'values': []}]

Production:

from functools import partial

keys = ("first", "last")
data = {"foo": [("aaa", "bbb"), ("ccc", "ddd")],
        "buz": [("xxx", "yyy")],
        "bar": [[]]}

print([{"name": key,
        "values": [dict(i) for i in map(partial(zip, keys), filter(None, value))]}
       for key, value in data.items()])


1 commentaires

merci, il me manque peut-être quelque chose, mais je veux utiliser des noms spécifiques pour les attributs et non une simple numération



0
votes

La solution est que la valeur doit être considérée comme une valeur unique:

[{
    "name": key, 
    "values": [
        {"first": names[0], "last": names[1]} for names in value if names
    ] 
 for key, value in input.items() ]


0 commentaires