Stackoverflow, bonjour

J'ai un gros problème avec la saisie d'une liste de plusieurs en plusieurs valeurs

Le code initial est:

animal_book={}
animal_type=['herbivorous', 'carnivorous']
animal_name=[['Elephant', 'Cow', 'Deer'], ['Tiger', 'Lion', 'Puma']]
animal_quantity=[[1, 2, 3], [4, 5, 6]]
animal_age=[['50','10','5'],['6', '7', '8']]


j=0
k=0
for i in animal_type:
    animal_book[i]=[{'type':animal_name[j][k], 'name': animal_quantity[j][k], 'age':animal_age[j][k]}]
    j += 1
print(animal_book)

Le résultat que j'ai est presque ce dont j'ai besoin, mais avec un seul premier composé dans une valeur animal_book, pas les plusieurs dictionnaires, comme je le voulais (je l'ai séparé manuellement par des lignes pour un meilleur look):

>>{'herbivorous': [
    {'name': 'Elephant', 'quantity': 1, 'age': '50'}
    ], 
'carnivorous': [
    {'name': 'Tiger', 'quantity': 4, 'age': '6'}
    ]
}

Cependant, mon objectif ici est de mettre ces listes dans plusieurs valeurs du dictionnaire. Le code requis est:

{'herbivorous': [
    {'name': 'Elephant', 'quantity': 1, 'age': '50'},
    {'name': 'Cow', 'quantity': 2, 'age': '10'},
    {'name': 'Deer', 'quantity': 3, 'age': '5'},
    ], 
'carnivorous':[
    {'name': 'Tiger', 'quantity': 4, 'age': '6'}
    {'name': 'Lion', 'quantity': 5, 'age': '7'}
    {'name': 'Puma', 'quantity': 6, 'age': '8'}
    ]
}

Est-ce que tout le monde sait comment résoudre le problème?

J'ai essayé d'ajouter les listes à animal_book.values () également après le for i in animal_type:

animal_book[i]=animal_book.values().append([{'name':animal_name[j][k], 'quantity': animal_quantity[j][k], 'age':animal_age[j][k]}])

Mais dans ce cas, j'ai une erreur: AttributeError: 'dict_values' object has no attribute 'append'

0
Fedor Peplin 8 avril 2020 à 11:12

4 réponses

Meilleure réponse

Première erreur: vous n'obtenez qu'un seul résultat car vous écrasez la valeur du dictionnaire à chaque fois avec la liste. Deuxième erreur: vous augmentez j de un et parcourez la liste des types d'animaux qui comprend 2 éléments, ce qui signifie que seuls deux éléments seront dans le dictionnaire.

from pprint import pprint               
animal_book={}
animal_type=['herbivorous', 'carnivorous']
animal_name=[['Elephant', 'Cow', 'Deer'], ['Tiger', 'Lion', 'Puma']]
animal_quantity=[[1, 2, 3], [4, 5, 6]]
animal_age=[['50','10','5'],['6', '7', '8']]



for j in range(len(animal_type)):
        value_list = []
        for k in range(len(animal_name[j])):
                value_list.append({'type':animal_quantity[j][k], 'name': animal_name[j][k], 'age':animal_age[j][k]})
                animal_book.update({animal_type[j]:  value_list})

pprint(animal_book)

Production:

{'carnivorous': [{'age': '6', 'name': 'Tiger', 'type': 4},
                 {'age': '7', 'name': 'Lion', 'type': 5},
                 {'age': '8', 'name': 'Puma', 'type': 6}],
 'herbivorous': [{'age': '50', 'name': 'Elephant', 'type': 1},
                 {'age': '10', 'name': 'Cow', 'type': 2},
                 {'age': '5', 'name': 'Deer', 'type': 3}]}
1
Ahmed Soliman 8 avril 2020 à 08:35

Voilà, cela résout votre problème. Vous devez avoir une boucle for imbriquée dans une autre et utiliser enumerate pour pouvoir garder une trace de l'index. De plus, si vous utilisez json.dumps(), il imprimera un joli dictionnaire pour vous.

import json

animal_type=['herbivorous', 'carnivorous']
animal_name=[['Elephant', 'Cow', 'Deer'], ['Tiger', 'Lion', 'Puma']]
animal_quantity=[[1, 2, 3], [4, 5, 6]]
animal_age=[['50','10','5'],['6', '7', '8']]

animal_book={}
for index, type in enumerate(animal_type):
    animal_book[type] = []
    for jdex, animal in enumerate(animal_name[index]):

        animal_book[type].append({
            'name': animal,
            'quantity': animal_quantity[index][jdex],
            'age': animal_age[index][jdex],
        })

print(json.dumps(animal_book, indent=2))

Cela produira:

{
  "herbivorous": [
    {
      "name": "Elephant",
      "quantity": 1,
      "age": "50"
    },
    {
      "name": "Cow",
      "quantity": 2,
      "age": "10"
    },
    {
      "name": "Deer",
      "quantity": 3,
      "age": "5"
    }
  ],
  "carnivorous": [
    {
      "name": "Tiger",
      "quantity": 4,
      "age": "6"
    },
    {
      "name": "Lion",
      "quantity": 5,
      "age": "7"
    },
    {
      "name": "Puma",
      "quantity": 6,
      "age": "8"
    }
  ]
}
0
Rob Kwasowski 8 avril 2020 à 08:27

Vous devez utiliser la fonction de plage pour parcourir les éléments de manière plus systématique:

animal_book={}
animal_type=['herbivorous', 'carnivorous']
animal_name=[['Elephant', 'Cow', 'Deer'], ['Tiger', 'Lion', 'Puma']]
animal_quantity=[[1, 2, 3], [4, 5, 6]]
animal_age=[['50','10','5'],['6', '7', '8']]


for i in range(len(animal_type)):
    for j in range(len(animal_name[i]):
        animal_book[i]=[{'type':animal_name[i][j], 'name': animal_quantity[i][j], 'age':animal_age[i][j]}]

print(animal_book)
0
Saurav Panda 8 avril 2020 à 08:28

Vous pouvez utiliser zip pour organiser vos données de manière appropriée et remplir votre livre avec ça:

animal_book ={}
animal_type=['herbivorous', 'carnivorous']
animal_name=[['Elephant', 'Cow', 'Deer'], ['Tiger', 'Lion', 'Puma']]
animal_quantity=[[1, 2, 3], [4, 5, 6]]
animal_age=[['50','10','5'],['6', '7', '8']]

# zip your data together, extract the typ again, put the remainder into R
for typ, *R in zip(animal_type, animal_name, animal_quantity, animal_age):
    # add the typ-list
    animal_book.setdefault(typ,[])

    # now handle the inner dicts data that have to be added to your lists
    # first create tuples for each animal as r
    for r in zip(*R):
        # then create tuples of (key,value) and make dicts from it
        animal_book[typ].append(dict(zip(["name","quantity","age"],r)))

# pretty print it
from pprint import pprint

pprint(animal_book)

Production:

{'carnivorous': [{'age': '6', 'name': 'Tiger', 'quantity': 4},
                 {'age': '7', 'name': 'Lion', 'quantity': 5},
                 {'age': '8', 'name': 'Puma', 'quantity': 6}],
 'herbivorous': [{'age': '50', 'name': 'Elephant', 'quantity': 1},
                 {'age': '10', 'name': 'Cow', 'quantity': 2},
                 {'age': '5', 'name': 'Deer', 'quantity': 3}]}

R ressemble à ceci:

[['Elephant', 'Cow', 'Deer'], [1, 2, 3], ['50', '10', '5']]
[['Tiger', 'Lion', 'Puma'], [4, 5, 6], ['6', '7', '8']]

Et r ressemblent à ceci:

('Elephant', 1, '50')
('Cow', 2, '10')
('Deer', 3, '5')

('Tiger', 4, '6')
('Lion', 5, '7')
('Puma', 6, '8')

Et zip(["name","quantity","age"],r) ressemble approximativement à ceci:

[('name', 'Elephant'), ('quantity', 1), ('age', '50')]
[('name', 'Cow'), ('quantity', 2), ('age', '10')]
[('name', 'Deer'), ('quantity', 3), ('age', '5')]
[('name', 'Tiger'), ('quantity', 4), ('age', '6')]
[('name', 'Lion'), ('quantity', 5), ('age', '7')]
[('name', 'Puma'), ('quantity', 6), ('age', '8')]
1
Patrick Artner 8 avril 2020 à 08:55