0

関数 pairSum(data, value) を作成しようとしています。リスト「データ」に合計が「値」に等しい 2 つの個別の数値が含まれている場合、関数は true を返します。リストを使用してこれを達成しましたが、辞書を使用してこの関数を作成できるより効率的な方法はありますか?

4

3 に答える 3

1

セットを使ってみることができます。

def pairSum(data, value):
  s = set()
  for i in data:
    if (value - i) in s:
      return True
    else:
      s.add(i)
  else:
    return False
于 2012-04-22T03:13:22.737 に答える
1
from itertools import combinations

pairSum = lambda data, value: any(sum(i) == value for i in combinations(data, 2))

編集set()PedroWerneckは、のメンバーシップテストの方が効率的かもしれないと 指摘しました。

pairSum = lambda data, value: value in set(sum(i) for i in combinations(data, 2))

さらに編集 私はIgnacioのアドバイスを受け、を使用して2つの方法をテストしましたtimeit。結果は以下のとおりです。

すべてのテストで、テストされた関数は、元の回答(上記)で投稿したものと同じです。

実行回数は10,000回です

data = range(100)

テスト値ジェネレータセット
         1 0.02824 10.84905
       101 0.66934 10.77293
       197 11.07062 10.73978

したがって、結論は、発電機は平均してより速く動作し、セットと発電機の両方の最悪の場合の時間はほぼ同じであるように見えます。

于 2012-04-22T03:18:17.563 に答える
0

辞書ではありませんが、すべての組み合わせを作成して、値がそのセットに含まれているかどうかを確認できます。

import itertools

def pairSum(data, value):
    return value in set(map(sum, itertools.combinations(data, 2)))

リストにゼロまたは負の値が含まれていない場合は、リスト内の他の値と等しいかそれ以上の値を合計すると一致しないため、リスト内のターゲットよりも低い値のみを保持できます。

import itertools

def pairSum(data, value):
    data = [v for v in data if v < value]
    return value in set(map(sum, itertools.combinations(data, 2)))
于 2012-04-22T03:23:29.400 に答える