LoginSignup
4

More than 5 years have passed since last update.

配列操作などその1

Posted at

はい。今更ながら2.7系ベースのお話です。辛いですね(´・ω・`) あと色々と私見にまみれたものになります。辛いですね...φ(・ω・`c⌒っ

初期に使うであろう配列はリスト、セット、タプル、辞書(連想)とかでしょうか。dequeとか使うのはもう初学者の領域ではないと思います。。

dequeなど参考先 http://docs.python.jp/2/library/collections.html

参考先:http://docs.python.jp/2/tutorial/datastructures.html

以下では配列の変数名をlとして書きます。

リスト型

おそらく使用頻度は1位。中の要素の順番の保証がある。中の要素を一部だけ変更したり、先頭や末尾、若しくは任意の中間のどこかで追加/削除を出来るなどとても優秀なできる子。

※リストにlistという名前は絶対に使わないでください。list(x)といったリスト型にキャスト、変更する操作が出来なくなります。

初期化

l=[]

追加操作

l.append(x)

リストの末尾にxを追加。l=l.append(x)とは書きません。というかlが空になってしまいます。

l.insert(i, x)

リストのi番目の位置にxを追加します。

l.extend(l2)

リストlの末尾にl2を結合して追加。l=[1,2,3] l2=[4,5,6]だとしたらl=[1,2,3,4,5,6]になります。元々のlを保持したい場合はl3=l+l2と書くと思います。

削除操作

l.remove(x)

リストの中で最初(インデックスが最も若い、一番左側)のxを削除。存在しない値を削除しようとするとValueErrorになるのでtry exceptかif in でなんとかしましょう。

l.pop(i)

i番目の要素を取り出す。iは指定しなかった、書かなかった場合は自動で末尾になります。p=l.pop(i)で取り除いた要素を別の変数に代入可能です。

その他操作

l.count(x)

リストの中のxの個数を数える。

l.sort()
リストの中の要素を昇順でソート。リストの中がint型やstr型混在でもエラーになりませんが混在させること自体ないと思うので詳細は略。

l.reverse()

リストの中を逆順でソート。降順ではありません。降順にしたいならsort()してからreverse()とかで。

セット型

おそらく使用頻度は2位。中の要素は重複したものは存在しません。順番の保証はありません。

初期化

l=set()

追加操作

l.add(x)

xを追加する。既に存在する要素を追加してもエラーなどにはなりません。リスト型のものは入れられないっぽいです。経路探索などで座標を管理する場合はl.add((y,x))とかタプル型にする必要があるっぽいです。

削除操作

l.remove(x)

中のxを取り除く。中には一つしか存在しないxが消えます。

l.pop()
中の要素を一つ取り出す。何が出てくるかは保証されないと思います。p=l.pop()で取り出した要素を別の変数に代入可能です。

その他の操作

順番の保証、概念自体がない?ようですがfor i in l: で中の要素を総当りすることは出来ます。
論理演算?で色々出来ます。これはあとで追記したいです。

辞書型(連想配列)

おそらく使用頻度は3位。中の要素でkeyは重複しない。具体的にこの問題の時にというのは略なのですが問題の入力制限ではkeyになる候補が0から10^9とかの割に実際には100種類程度のkeyしか処理しない場合とかに辞書型を使うのでしょうか。長さ10^9の配列を0埋めなどで作って処理はかなり辛いと思います。

初期化

l={}
中の要素は{key1:value1, key2:value2} keyとvalueが対になって存在します。

keyは重複して存在しないので重複したキーを追加しようとすると元々存在してたほうが消えます。

追加操作

keyの追加
l[key]=value

いきなり追加するのは危険なので既にkeyが存在するか調べるべきだと思います。if l.has_key(key): か if key in l:とかでしょうか。私は特に理由もなく前者パターンしか使ってないですが。

キーは変更不可、イミュータブルな要素でないといけないのでリスト型などは指定できません。

valueの追加

valueには様々な型の値が使えるのでkeyの出現回数の増減をl[key]+=1をしたり、特定のkeyに所属する何かをl[key].append("hoge")したりできます。

削除操作

key自体の削除(valueも合わせて消えます)

del l[key]

valueの削除

何かしらのvalueが存在する必要があるので用途に合わせて0や""、[]かなと思います。

その他の操作

l.keys()
s=l.keys()などでkeyのみを別のリストに取り出したり出来ます。
for k,v in sorted(l.items()):
keyの値でソート
for k,v in sorted(l.items(), key=lambda x:x[1])
※l.items()だけを試してみると何が行われているのかよりわかると思います。

タプル型

中の要素は変更不可。順番の概念は有り。

初期化

l=()
っていっても変更不可のものとして扱うので初期化で用意することは無いと思います。

追加、削除操作

追加や削除は無いものと思っていい気がします。再代入や新たな変数に代入で2つ以上のタプルを結合したり、スライス操作を頑張って削除のようなことを出来ないこともないと思いますが。。。

その他の操作

特に何か操作することはないと思います。辞書型のkeyにするとか、set型の中に入れて座標をごにょごにょするとか中の要素を変更せず、かつタプル型でないとダメという場面でしか使わない気がします。

特に型を限定しない軽い話

リスト型とかをfor i in range(n):とかindex値で範囲外になりそうなのを厳密に管理せずにtry〜except でエラー時にpassでごまかす。エラー発生までの処理は行われる、有効なのでご利用は慎重に。

配列操作だとforでごにょごにょするお話とかも書かないとだと思うのですがまた今度で。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4