Проблема ввода нескольких списков в словарные значения - PullRequest
0 голосов
/ 08 апреля 2020

Stackoverflow, привет

У меня большая проблема с вводом нескольких списков в несколько значений

Исходный код:

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)

Результат у меня почти что мне нужно, но только с одним первым соединением в значении animal_book, а не с несколькими словарями, как я хотел (я разделил его на строки вручную, чтобы лучше было смотреть):

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

Однако моя цель здесь можно поместить эти списки в несколько значений словаря. Требуемый код:

{'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'}
    ]
}

Все знают, как решить проблему?

Я пытался добавить списки в animal_book.values ​​() также после 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]}])

Но в этом случае у меня появляется ошибка: AttributeError: 'dict_values' object has no attribute 'append'

Ответы [ 4 ]

1 голос
/ 08 апреля 2020

Вы можете использовать zip , чтобы упорядочить свои данные подходящим образом и наполнить свою книгу этим:

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)

Вывод:

{'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 выглядит так:

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

и r выглядит так:

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

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

и zip(["name","quantity","age"],r) выглядит примерно так:

[('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 голос
/ 08 апреля 2020

Первая ошибка: вы получаете только один результат, потому что вы каждый раз перезаписываете значение словаря списком. Вторая ошибка: вы увеличиваете j на единицу и перебираете список типов животных, который имеет 2 элемента, что означает, что в словаре будут только два элемента.

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)

Вывод:

{'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}]}
0 голосов
/ 08 апреля 2020

Вы должны использовать функцию диапазона, чтобы перебирать элементы в более систематической форме c:

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 голосов
/ 08 апреля 2020

Здесь вы go, это решает вашу проблему. Вы должны иметь один for l oop, вложенный в другой, и использовать enumerate, чтобы вы могли отслеживать индекс. Кроме того, если вы используете json.dumps(), он автоматически напечатает словарь для вас.

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))

Это выдаст:

{
  "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"
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...