sort / sorted

Pythonでリストの要素の並び順を整理したいと思うことがあります。これには sort もしくは sorted を使います。
sort は元のリスト自体を書き換えてしまうの破壊的な処理をするのに対して、sorted は元のリストは保存します。並び変わる順は基本的には「小さい数字 → 大きい数字 → 記号 → アルファベット大文字 → アルファベット小文字」となります。ascii文字以外はよく分かりません。詳しくは「python コードポイント」で調べてみてください。


さて、両者の使い分けを以下のサンプルスクリプトで確認してください。

(2-3行目) sort したのでリストAそのものが変更されました。
(6-7行目) sorted では元のリストAは変更されていません。


これだけでもなかなかの機能ですが、さらに並び替える順番を自分で指定することもできます。sorted の引数に key を記述してやるだけです。

以下のサンプルでは、リストを要素に持つリストを並び替える例です。1つ1つの要素であるリストの2番目の数字が小さい順にソートさせてみました。

この例で lambda という記述があります。lambdaというのは無名関数のことです(詳細は別記事)。なぜ lambda を使わなくてはいけないのか、使うと上手く動作するのか、はきちんと説明できませんので、へ〜こういう書き方があるんだ、と思うだけでご容赦願います。笑


Pythonの記事一覧へは こちら から。

reverse / reversed

Pythonのリストの順番を逆にしたい時には、reverse または reversed を使います。
両者の大きな違いは元のリストを保存するかどうかです。reverse は元のリスト自体を変更する破壊的な処理をするが、reversed は元のリストは保存する、ということだけ覚えておきましょう。sort / sorted の時と同じですね。


以下のサンプルスクリプトでその違いを確認してください。

(3-4行目) reverseしたのでリストAそのものが逆順になっているのが分かります。
(6-7行目) もう一度reverseさせれば元に戻ります。当然です。
(9-10行目) reversedをかけてもリストA自体は変更されていないのが分かります。余談ですが、reversed(A) とだけすると listreversediterator というよく分からないオブジェクトになってこのままでは扱えないので、外から list をかけて無理やりリスト型に戻しています。


Pythonの記事一覧へは こちら から。

index

Pythonのリストで、ある特定の値や文字を持つ要素がリストの何番目に存在するかを知りたい場合があります。

これには index を使って次のように書くことができます。


これを少しだけ応用してみます。
数字を要素に持つリストのうち、最大値を持つ要素はリストの何番目に存在するかを知るためには次のように書きます。
max(A) というのが、リストAの中の最大値を求めてくれる関数です。何もモジュールなどインポートしなくても使えます。


とても大事な注意点があります。次の例を見てください。

リストAの中には "ccc" という要素が2つ(2番目と5番目)あります。ですが、index で答えてくれるのは2番目だけです。
実はindexは、同じ要素が複数あったとしてもその最初のindexしか教えてくれません。

順番を知りたい要素が複数ありそうな場合にはindexでは役不足です。
何か別の関数があれば良いのですがそれは私は知らないので、次のように書いています。


Pythonの記事一覧へは こちら から。

内包表記

Pythonのリストの書き方に内包表記というものがあります。

まず書き方を覚えてください。
[ 要素 for i in (リスト) ]
というように書きます。もしif文を挟ませたかったら
[ 要素 for i in (リスト) if (条件) ]
このように最後にif条件文を記します。
elseやfor二重の文なども書けますが、それくらい複雑になってくると普通に書く方が良いのではと思います。


内包表記のメリットは2つあります。
1つ目は行数が減らせる、ということ。Pythonはもともと短く書ける言語です。でもこの内包表記を使えばさらに短く書けます。
2つ目は実行速度が速くなる、ということ。これは膨大な処理をさせるプログラムを書くようになるとありがたみを実感してくる部分ですが、とても簡単にできる高速化の工夫の1つです。


では、内包表記の 2つのメリットを感じてもらうために以下のサンプルスクリプトを見比べてください。

2つのスクリプトは、100000000までの整数を要素に持つリストを作って、適当にそのうちの1つを表示させているだけのものです。
通常の書き方では4行かかっているところ、内包表記では1行で書けているのがわかりますね。大規模なプログラムになると大量のリストを扱うようになります。1つのリストにかける行数が少なくなるとプログラム全体も見やすくなって良いですね。

では、処理速度の方はどうでしょうか?
2つのスクリプトの実行速度を何回か計測してその平均を取ってみたところ、通常の書き方では26秒程かかるところ、内包表記だと15秒程で完了していました(実行環境に大きく依存)。手軽に約4割も短縮できました。
余談ですが、これだけ差が生まれる一番の要因は、通常の書き方だと append メソッドを毎回呼び出すのに時間がかかっているから、です。


ということで、内包表記の魅力、お分かりいただけたでしょうか。


Pythonの記事一覧へは こちら から。

append と extend と insert

今回からはPythonのリストの扱い方を学びます。
リストに要素を追加する方法は大きく3つあるので、それを整理します。


最も基本的な方法は append です。
append はリストの最後に1つの要素を追加します。
追加する要素は整数、少数、文字、リスト、ディクショナリーなど何でもいけます(たぶん)。
シンプルながら、これ1つ使えれば十分です。

続いて、extend。
extend はリストの最後に(1つではなく)複数の要素を追加します。
注意点として、引数にはリストを渡してやりますが、追加されるのはリストそのものではなく、リスト内の各要素となります。

そして insert 。
insert はリストの任意の位置に、1つの要素を追加・挿入します。
引数の1つ目にどこに挿入するか、2つ目に何を挿入するかを記します。


まとめとしてサンプルスクリプトを見てみましょう。

(4行目) appendで、リストAの末尾にリストBという1つの要素を追加しています。
(7行目) extendで、リストAの末尾にリストBの要素2つを順に追加しています。
(10行目) insertで、リストAの2番目にリストBという1つの要素を挿入しています。


最後に、これら3つの方法は破壊的メソッドと言い、元のリストを書き換えてしまいます。元のリストを残しておきたい時には、同じ要素を持った別のリストを作ってから実行させましょう。
まあ、追加した要素を消せば元には戻りますが、怖いので。


Pythonの記事一覧へは こちら から。

continue と break

for文やwhile文のループにおいて、
・あるループの処理の途中だが次のループに移りたい
・とにかくループ処理(for/while)を終わりたい
といったことがよくあります。それぞれ、continue と break を使うことで解決できます。


ここで例題を出してみましょう。
「1から100までの整数の7の倍数を除いたものの総和を求めよ」

書き方は何通りかあるでしょうが、ここでは continue と break を無理やり使う書き方をここでは紹介します。

(1-2行目) 最初に総和を入れるための変数sと、整数をカウントしていく変数iを0にセットしておきます。
(3行目) while True でひたすらループさせます。
(4行目) iに1足します。
(5行目) まずiが100を越えるかどうかをチェックします。越える場合にはループ終了。
(6行目) iが7の倍数の場合にはそれ以降の処理を行わず、次のループ(i=8)に移ります。
(7行目) iが7の倍数でなければ、その数をsに足していきます。

以上、continueとbreakの使い方。簡単ですね。


Pythonの記事一覧へは こちら から。

while True

まず、for文とwhile文の違いはお分かりでしょうか?
どちらもループさせる関数であることは共通ですが、決定的に違う点があります。それは繰り返し回数が決まっているかどうか、です。

for文では、例えば for i in A であれば、リストAの要素の数だけループを回すことが事前に決まっています。
一方while文では、条件が真である限り、または途中で強制終了されない限り、ずっとループします。1000回でも10000回でもループします。


さて、while文の条件の書き方ですが、
while a < 100 :
のような書き方が一般的だと思いますが、たまに
while True :
といった書き方もあります。これは、とにかく条件は何でもいいからひたすらループしろ!という意味ですね。手取り早いので筆者も気に入っている書き方です。
ただし、これだけだと永遠にループしてしまうので、きちんとループを抜ける処理を書いておく必要があります。
例えば、以下のように何かの条件に合致すれば break させてやれば良いでしょう。


Pythonの記事一覧へは こちら から。