0

これはちょっと複雑なので、このための簡単な構成を見逃している場合は、私に知らせてください:)

いくつかのマッチング実験の結果を分析しています。experiments[0]["cat"]["cat"]最後のゲームでは、「cat」が「cat」と一致した回数を生成するなどのクエリを実行できるようにしたいと思います。逆にexperiments[0]["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」の値を取得していますexperiments[0]["cat"]。私はこれに間違ってアプローチしましたか?ここでのバグは何でしょうか?狂気にごめんなさい、そしてどんな可能な助けにも感謝します!

4

2 に答える 2

2

2 つのポイント:

  • ディクショナリ キーはタプルにすることができます。と
  • ものを数える場合は、 を使用しますcollections.Counter。( を使用できますdefaultdict(int)が、Counterより便利です。)

だから、代わりに

experiments[experiment][classes[i]][classes[matches[experiment][i]]] += 1

書きます

experiments = Counter()
...
experiments[experiment, classes[i], classes[matches[experiment][i]]] += 1
于 2012-08-09T20:40:11.890 に答える
0

私はあなたのニーズを推測しようとしているだけなので、寸法の順序を変更しようとしました.

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"]))
于 2012-08-09T20:58:45.093 に答える