2

シーケンスですべての双方向比較を行うための最もPython的な方法は何ですか?

私がこれまでに試したこと:

[compare(i, j) for i in sequence for j in sequence]

最悪。n / 2(n-1)の比較の代わりにn^2を実行します。また、アイテムをそれ自体と比較します。

l = []
for i in xrange(1,len(sequence)):
    for j in xrange(i-1):
        l.append(compare(sequence[i], sequence[j]))

ぶさいくな。

[compare(i, j) for i, j in permuations(sequence, 2)]

これはそれかもしれませんが、それがPythonicであるかどうかはわかりません。

4

2 に答える 2

4

これは、列挙型を使用した例の1つのバリエーションです(forループ、実行時間:(n --1)n / 2 ) 。

seq = (1, 2, 4, 8, 16, 32, 64)

def compare(a, b):
    print('%s ~ %s' % (a, b))

if __name__ == '__main__':
    for i, item in enumerate(seq, start=1):
        for other in seq[i:]:
            compare(item, other)

どの出力:

1 ~ 2
1 ~ 4
1 ~ 8
1 ~ 16
1 ~ 32
1 ~ 64
2 ~ 4
2 ~ 8
2 ~ 16
2 ~ 32
2 ~ 64
4 ~ 8
4 ~ 16
4 ~ 32
4 ~ 64
8 ~ 16
8 ~ 32
8 ~ 64
16 ~ 32
16 ~ 64
32 ~ 64

itertoolsを使用すると、さらに短く書くことができます。

import itertools

# ...

for a, b in itertools.combinations(seq, 2):
    compare(a, b)
于 2013-03-06T02:52:56.587 に答える
0

どうですか:

[compare(seq[k], i) for k in range(len(seq)) for i in seq[k+1:]]

これは、2番目のスニペットと同じ比較パターンに従います。

于 2013-03-06T03:37:41.860 に答える