【python】指定した値で割り算できるペアを求めるプログラム


【python】指定した値で割り算できるペアを求めるプログラム

自分用のメモです。

▼設問

  • 正の整数の入ったlistが与えられる.(ar)
  • listから整数を2つ抜きだし、合計値がk(正の整数)で割り切れるペアの数を求める.

URL

▼sample input

k=3
ar=[1,3,2,6,1,2]

▼sample output

5

▼my answer

def divisibleSumPairs(n, k, ar):
    ans = 0

    for n,i in enumerate(ar):
        arr=[]
        arr =list(map(lambda x:(x+i)%k, ar[n+1:]))
        ans += arr.count(0)
    return ans

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    nk = input().split()
    n = int(nk[0])
    k = int(nk[1])
    ar = list(map(int, input().rstrip().split()))
    result = divisibleSumPairs(n, k, ar)
    fptr.write(str(result) + '\n')
    fptr.close()


考え方
  • 組み合わせの全パターンを出す。
  • 各要素をkで割った余りを求める。
  • 余り=0となった数を足し上げる。

▼一度かけ合わせた組み合わせは除外。

for n,i in enumerate(ar):
    print(ar[n+1:])

#------------------
[3, 2, 6, 1, 2]
[2, 6, 1, 2]
[6, 1, 2]
[1, 2]
[2]
[]

・map関数
map(関数,イテラブル)

イテラブルの要素を一つづつ抜き出し、関数を実行した値を返す。

▼こんなときに使う
・listの各要素をそれぞれn倍したい。
・lambda式と一緒に使われることが多い。
 └ lambda式:関数(def)を一文で書いたもの

▼処理
for文と関数が組み合わさった処理。

▼注意点
出力値はmap型。
listが欲しい場合は、list()で変換する。



・lambda式
defで定義する関数の簡略版。
メソッド名をつけず、引数と処理を一文で記述する。

lambda 引数:処理



・mapとlambda
map(lambda 変数:処理, イテラブル)

イテラブルの要素を一つづつ抜き出し、lambdaの変数に入れ処理を実行。この処理を各要素に対し行う。

・enumerate関数
・for文で使う
・インデックス番号を抜き出す

for 変数1, 変数2 in enumerate(イテラブル):
 └ 変数1:インデックス番号が入る。
 └ 変数2:抜き出した要素が入る。

▼こんなときに使う
・forが何回目の処理か知りたい。

英語が見慣れないのと長いので、難しそうだが実際は単純。

通常のfor文:「for 変数2 in イテラブル」
 ①index番号を入れる変数を追加(先方に書く)
 ②イテラブルをenumerateで囲む。