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