読者です 読者をやめる 読者になる 読者になる

aisaka.com

自分が知りたかったこと・日々の思考・共有したいニュースを発信

転倒数を数える。[Python 3.0]

Everything is practice.

f:id:aisakakun:20160211195612j:plain

 

転倒とは、自然な順番に並んでいない要素の配列のペアです。

例えば、昇順で使うとしたら

[1,2,4,3,5]

 の場合、[4,3]のみが昇順となっていないため、転倒数は1になります。

また、

[1,2,5,3,4] 

 の場合、[5,3],[5,4]が昇順となっていないため、転倒数は2になります。

こういった数を数えるために私が初めに作ったプログラムはシンプルに、

 

とりあえず作りたいものは作れましたが冗長性が高い。

そのため、他の人のものを見ると短いものがありました。

こんな感じ。

 

なんとなくわかるが一つずつ考えてみよう。

まず、sum()は、カッコ内の要素を足し合わせた値を出力する関数ですね。

そして、そのカッコ内に再びsum()

for i,n in enumerate(sequence)

sequenceはリストであり、例えば

 sequence = [1,2,4,3,5]

 です。

そして、初めて見た enumerate。これはなんだ。

調べてみると、「ループする際にインデックスつきで要素を得ることができる」

らしい。

例えば、

a = ["l","m","n"] 

for i,n in enumerate(a):

     print(i,n)

 

出力

→0 l

 1 m

 2 n

 

  となるらしい。中々使えるやつ。

ちなみに、enumerate = 列挙する、数え上げる

とかいう意味なので、配列に関するものを列挙するということなのかな?

 

というわけで、enumerate関数により、要素のインデックスと要素をそれぞれ

i,nの変数に入れれるわけですね。

 

そして、前に戻って、

m<n for m in sequence[ i+1: ] 

 ですが、前の「m<n」が条件で、mの値がnよりも小さいとき。

mは、sequence[ i + 1 :]

となっていることから、sequenceのi+1番目から後ろの値がmに1回ずつ

与えられていって、sequenceの最後までいくということですね。

この文の読み方としては、nの値が初めに一つ入って、

mとnを比較していき、nの方が大きかった場合の数をカッコ内のsum()で求めて、

次のnの値も同様に...という感じですね。

そして、後ろのループがすべて終了して初めて外側のsum()が動作して、

今まで数え上げてきた数が足し合わされて、合計の転倒数がわかるという仕組みですね。

これならば自分でも作れたかも。

一行で終わらせるのはやはり美しい。

 

 

 Pythonをこれから始めたい方にオススメの本↓

Pythonスタートブック

Pythonスタートブック