3

値を持つ2つのリストがあります。期待される結果はタプルです(a,b)。ここaで、はi値の数でありlist1[i] < list2[i]bはi値の数ですlist1[i] > list2[i](等式はまったくカウントされません)。

私はこの解決策を持っています、そしてそれは完全に機能します:

x = (0,0)
for i in range(len(J48)):
    if J48[i] < useAllAttributes7NN[i]:
      x = (x[0]+1,x[1])
    elif J48[i] > useAllAttributes7NN[i]:
        x = (x[0], x[1]+1)

しかし、私は自分のPythonスキルを向上させようとしており、それを達成するための非常に非Python的な方法のようです。

同じ結果を達成するためのPythonの方法は何ですか?

参考binom_test()までに、これは、 2つのアルゴリズムが統計的に同一ではないことを証明する ために必要な入力を達成するために行われます。
ただし、この情報が特定の質問に追加の価値をもたらすとは思わない。

4

6 に答える 6

5

1つの方法は、スコアのセットを作成してからそれらを合計することです。

scores = [ (a < b, a > b) for (a, b) in zip(J48, useAllAttributes7nn) ]
x = (sum( a for (a, _) in scores ), sum( b for (_, b) in scores ))

// Or, as per @agf's suggestion (though I prefer comprehensions to map)...
x = [ sum(s) for s in zip(*scores) ]

もう1つは、それらを1回圧縮してから、スコアを個別にカウントすることです。

zipped = zip(J48, useAllAttributes7nn)
x = (sum( a < b for (a, b) in zipped ), sum( a > b for (a, b) in zipped ))

これはPython3では機能しないことに注意してください(@Darthfettに感謝します)。

于 2012-04-30T18:49:31.360 に答える
4

楽しみのために、複素数を使用してこの問題を解決します。Pythonicではありませんが、かなり数学的なものです:-)

この問題を、結果を2次元の複雑な空間にプロットすることと考えてください。

result=sum((x < y) + (x > y)*1j for x,y  in zip(list1,list2))
(result.real,result.imag)
于 2012-04-30T19:40:31.920 に答える
2
import itertools

x = [0, 0, 0]
for a, b in itertools.izip(J48, useAllAttributes7NN):
    x[cmp(a, b)] += 1

そして、等式を数えるので、ちょうどx[0]とを取ります。x[2]x[1]

別の方法(リストを2回解析する必要があります):

first = sum(1 for a, b in itertools.izip(J48, useAllAttributes7NN) if a > b)
second = sum(1 for a, b in itertools.izip(J48, useAllAttributes7NN) if a < b)
于 2012-04-30T18:48:31.030 に答える
2

簡単な解決策は次のとおりです。

list1 = range(10)
list2 = reversed(range(10))
x = [0, 0]
for a, b in zip(list1, list2):
    x[0] += 1 if a < b else 0
    x[1] += 1 if a > b else 0
x = tuple(x)

私たちに与える:

(5, 5)

zip()一度に2つのリストを反復処理するための最良の方法です。Python 2.xを使用している場合はitertools.izip、パフォーマンス上の理由から使用することをお勧めします(Python3.xのように怠惰ですzip()

リストは変更可能であるため、リストの変更を停止するまで、リストでの作業も簡単です。

編集:

使用するバージョンのPython3互換バージョンcmp

def add_tuples(*args):
   return tuple(sum(z) for z in zip(*args))

add_tuples(*[(1, 0) if a < b else ((0, 1) if a > b else (0, 0)) for a, b in zip(list1, list2)])
于 2012-04-30T18:49:32.670 に答える
0

さて、どうですか:

import itertools
def func(list1, list2):
    x,y = 0,0
    for (a,b) in itertools.izip(list1, list2):
      if a > b:
        x += 1
      elif a < b:
        y += 1
    print x,y
于 2012-04-30T18:51:16.063 に答える
0
list1 = [1, 3, 7, 15, 22, 27]
list2 = [2, 5, 10, 12, 20, 30]

x = 0
y = 0 
for index, value in enumerate(list1):
    if value < list2[index]:
        x += 1
    elif value > list2[index]:
        y += 1

print (x, y)
于 2012-04-30T19:07:11.180 に答える