我在创建二维字典时遇到了麻烦。我搜索过这个网站也有很多其他人,找不到任何可以帮助我处理我的问题!
我需要创建一个二维字典,根据动物和品种两个区别因素对数据进行排序。数据从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']}
这是文件中猫的最后一个品种条目,因此我的字典覆盖了每个品种条目,因为它在列表中循环。对于如何解决这个问题,有任何的建议吗? 对于部分内容的歧义感到抱歉 - 我只能在没有实际输入文件的情况下解释这么多。
答案 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']
]}