Python字典键错误。。字典列表中的字典乱七八糟
这有点复杂,所以如果我错过了一个简单的构造,请让我知道:) 我正在分析一些匹配实验的结果。在游戏结束时,我希望能够查询Python字典键错误。。字典列表中的字典乱七八糟,python,debugging,Python,Debugging,这有点复杂,所以如果我错过了一个简单的构造,请让我知道:) 我正在分析一些匹配实验的结果。在游戏结束时,我希望能够查询实验[0][“cat”][“cat”],这会产生“cat”与“cat”匹配的次数。相反,我可以做实验[0][“cat”][“dog”],当第一个查询是cat,而匹配尝试是dog 以下是填充此结构的代码: # initializing the first layer, a list of dictionaries. experiments = [] for
实验[0][“cat”][“cat”]
,这会产生“cat”与“cat”匹配的次数。相反,我可以做实验[0][“cat”][“dog”]
,当第一个查询是cat,而匹配尝试是dog
以下是填充此结构的代码:
# initializing the first layer, a list of dictionaries.
experiments = []
for assignment in assignments:
match_sums = {}
experiments.append(match_sums)
for i in xrange(len(classes)):
for experiment in xrange(len(experiments)):
# experiments[experiment][classes[i]] should hold a dictionary,
# where the keys are the things that were matched against classes[i],
# and the value is the number of times this occurred.
experiments[experiment][classes[i]] = collections.defaultdict(dict)
# matches[experiment][i] is an integer for what the i'th match was in an experiment.
# classes[j] for some integer j is the string name of the i'th match. could be "dog" or "cat".
experiments[experiment][classes[i]][classes[matches[experiment][i]]] += 1
total_class_sums[classes[i]] = total_class_sums.get(classes[i], 0) + 1
print experiments[0]["cat"]["cat"]
exit()
很明显这有点复杂。最后一次匹配得到的值是“1”,而不是实验[0][“cat”]
的完整字典。我是不是搞错了?这里的虫子是什么?为这种疯狂感到抱歉,并感谢任何可能的帮助 两点:
- 字典键可以是元组;及
- 如果你在数东西,使用。(您可以使用
,但是defaultdict(int)
计数器更有用。)
experiments[experiment][classes[i]][classes[matches[experiment][i]]] += 1
写
我只是想猜测你们的需求,所以我试着改变你们维度的顺序
for className, classIdx in enumerate(classes):
experiment = collections.defaultdict(list)
experiments[className] = experiment
for assignment,assignmentIdx in enumerate(assignments):
counterpart = classes[matches[assignmentIdx][classIdx]]
experiment[counterpart].append((assignment,assignmentIdx))
print(len(experiments["cat"]["cat"]), len(experiments["cat"]))
你必须使用字典吗?在这件事上说OOP不是更容易吗?@favoretti也许。。。虽然目前还不清楚什么样的对象可以简化这个过程。我无法更改原始数据格式(类列表或匹配列表)。您的代码看起来应该可以正常工作--您只将第一个字典定义为defaultdict,因此从
实验[0][“cat”]
中获取“1”似乎很奇怪。。。如果您放弃了特定的实验作业,您是否仍然从实验[0][“cat”]
中获得值“1”?请修复标识。现在还不清楚打印和退出是否在第一个循环中,这也很奇怪。你为什么要使用dict of dicts?在代码中,您创建的是defaultdict,并且总是将单个值放在其中,这很难从问题中分辨出来,但我有一种感觉,它最终应该说一些更简单的东西,比如实验[experiment_index,cls,value]+=1
。
for className, classIdx in enumerate(classes):
experiment = collections.defaultdict(list)
experiments[className] = experiment
for assignment,assignmentIdx in enumerate(assignments):
counterpart = classes[matches[assignmentIdx][classIdx]]
experiment[counterpart].append((assignment,assignmentIdx))
print(len(experiments["cat"]["cat"]), len(experiments["cat"]))