将多个列表输入字典值时出现问题

时间:2020-04-08 08:12:27

标签: python python-3.x list dictionary

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

每个人都知道如何解决问题吗?

我也尝试在for i in animal_type之后将列表添加到animal_book.values():

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 个答案:

答案 0 :(得分:1)

第一个错误:您只会得到一个结果,因为您每次都用list覆盖字典值。 第二个错误:您将j加1并遍历具有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}]}

答案 1 :(得分:1)

您可以使用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')]

答案 2 :(得分:0)

在这里,您可以解决问题。您必须将一个for循环嵌套在另一个循环中,并使用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"
    }
  ]
}

答案 3 :(得分:0)

您应该使用range函数以更系统的方式遍历项目:

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)
相关问题