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
3 Réponses :
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()]
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é.
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()])
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
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() ]
Habituellement, vous pouvez simplement utiliser le module
jsonpour sérialiser votredict. 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 .