python中的2d字典

时间:2017-01-30 20:46:22

标签: python dictionary 2d

我在创建二维字典时遇到了麻烦。我搜索过这个网站也有很多其他人,找不到任何可以帮助我处理我的问题!

我需要创建一个二维字典,根据动物和品种两个区别因素对数据进行排序。数据从csv文件导入。我开始将文件的每一行分类为2d列表,其中每个条目是一个动物/品种组合的数据。

    for line in file:
        entries = line.split(',')
        list.append(entries)

这部分工作正常,给我一个组织良好的清单。当我尝试将此列表排序为使用动物和品种名称作为类型的2d字典时,我的问题就出现了。所以mydict ['animal'] ['breed']会给我一份关于动物和品种组合的统计数据列表。 mydict ['cat']将列出与猫相关的所有品种以及映射到每个品种的列表值。我的问题是我只能为每个mydict ['animal']获得一个品种。这是我的一个尝试的例子。我试图在不导入任何补充词典的情况下这样做。

    for i in range(0, len(list)):
        #animal type is first element of the list
        key = list[i][0]
        #breed is second element of the list
        breed = list[i][1]
        animal_dict.set_default(key, {})[breed] = list[i][2:]
    print(animal_dict['cat'])

当我跑步时,我得到:

{'Siamese': ['15 years', 'No', 'Yes', '165']}

这是文件中猫的最后一个品种条目,因此我的字典覆盖了每个品种条目,因为它在列表中循环。对于如何解决这个问题,有任何的建议吗? 对于部分内容的歧义感到抱歉 - 我只能在没有实际输入文件的情况下解释这么多。

1 个答案:

答案 0 :(得分:1)

简短回答

这一行是在写旧数据:

animal_dict.set_default(key, {})[breed] = list[i][2:]

在这里使用append而不是赋值。您需要创建一个空列表以追加到第一个。

答案很长

制作索引并使用它循环遍历列表并不是非常Pythonic - 只需直接浏览列表中的元素即可!我们打电话给您的列表animals和您的输出字典animal_dict

animal_dict= {}
for animal in animals:
    species = animal[0]
    breed = animal[1]
    stats = animal[2:]

这不是最简单的方法,但它很简单。现在,我们需要确保我们在字典中有这些物种。一个简单的方法是:

if species not in poke_dict:
    animal_dict[species] = {}

现在我们检查这个字典中是否有breed。如果没有,我们就做到了:

if breed not in animal_dict[species]:
    animal_dict[species][breed] = []

最后,既然我们确定我们的dict具有正确的动物和品种键,我们可以使用append添加新条目:

animal_dict[species][breed].append(stats)

将它们放在一起,并带有一些测试值:

animals = [
    ['cat', 'Siamese', '15 years', 'No', 'Yes', '165'],
    ['cat', 'Bombay', '15 years', 'No', 'Yes', '165'],
    ['dog', 'Labrador', '15 years', 'No', 'Yes', '165'],
    ['cat', 'Siamese', '15 years', 'No', 'Yes', '165'],
    ['dog', 'Poodle', '15 years', 'No', 'Yes', '165'],
]

animal_dict= {}
for animal in animals:
    species = animal[0]
    breed = animal[1]
    stats = animal[2:]
    if species not in animal_dict:
        animal_dict[species] = {}
    if breed not in animal_dict[species]:
        animal_dict[species][breed] = []
    animal_dict[species][breed].append(stats)
print animal_dict['cat']

施工

if species not in animal_dict:
    animal_dict[species] = {}
if breed not in animal_dict[species]:
    animal_dict[species][breed] = []

笨拙,可以用setdefault代替:

animal_dict= {}
for animal in animals:
    species, breed, stats = animal[0], animal[1], animal[2:]
    animal_dict.setdefault(species, {}).setdefault(breed, []).append(stats)
print animal_dict['cat']

如果每种动物/品种组合只有一个实例:

animal_dict = {}
for animal in animals:
    species, breed, stats = animal[0], animal[1], animal[2:]
    animal_dict.setdefault(species, {}).setdefault(breed, stats)
print animal_dict['cat']['Bombay']

输出:

{'Siamese': [
   ['15 years', 'No', 'Yes', '165'], 
   ['15 years', 'No', 'Yes', '165']
], 
'Bombay': [
   ['15 years', 'No', 'Yes', '165']
]}