Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21499

猿でも分かるPython入門 (その2)

$
0
0

 さて、前回に引き続き、Python初心者向けの記事です。今回は下の目次通り、Pythonのリストについて扱います。

目次

  1. リストの作成
  2. リスト内データ抽出
  3. リストの編集・追加・削除
  4. リストの動作原理

1. リストの作成。

 前回は変数や型について学びました。型には、実数を表すfloat、整数を表すint、テキストを表すstr、TrueかFalseを表すbooleanなどがありましたが、今回は新しい型listをご紹介します。
 さて、前回取り上げた変数ですが、基本的には方1つの変数には1つのデータしか入れることができません。前回は製品を輸入した際の金額を計算しましたが、1つの変数に1つのデータしか代入できないとなると、4品目の金額データを入れたいときには以下のように記述することになってしまいます。

price1=2price2=2.5price3=13price4=1.15

 しかし、基本的に分析を行いたい場合というのは多くのデータがある場合です。4つだから4行で済んでいるものの、もし品目が100個あったらprice100まで記述しなければいけないことになってしまいます。
 そして、100行分の変数を記述する代わりにできることが、リストを使うことです。リストを使えば、角括弧([])とコロン(,)を用いて以下のように記すことができます。これが新しいデータ型listです。

[2,2.5,13,1.15]

 そして、このデータもまた、変数の中に代入することができます。やり方は、単純に変数とイコールで繋いであげるだけです。

price=[2,2.5,13,1.15]

 これで、priceという変数にリストを代入することができました。このリストの中には、float型でもintegerでもbooleanでもstringでも、どんな型のデータも入れることができます。また、以下のように1つのリストの中に異なる型のデータを入れることも可能です。
 例えば、以下のように単に「いくらなのか」という情報だけでなく「どの品目がいくらなのか」という情報も1つのリストに格納できます。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]

 そしてこれだけではありません。リストの中にまたリストを入れることも可能です。

price=[["ItemA",2],["ItemB",2.5],["ItemC",13],["ItemD",1.15]]

 上記の例だと、1つのリストの中に4つのサブリストが入っているという構造になっています。以上の様にすれば、一番目のリストがItemAのリスト、次がItemBのリスト、と品目ごとにリストを作成できるため、よりデータの管理が容易になります。

 また、変数もリストの中に入れることも当然できます。例えば、前回輸入コストを求めるにあたって使った変数を1つのリストの中に入れてしまうと、以下のようになります。

price=2exchange=110tax=0.13totalprice=price*exchange*(1+tax)price_list=[price,exchange,tax,totalprice]print(price_list)#上記のコードをrunすると、[2, 110, 0.13, 248.59999999999997]というリストが返される。
price_list2=["price",price,"exchange",exchange,"tax",tax,"totalprice",totalprice]print(price_list2)#リスト内には、異なる型のデータも格納できるた
#上記のコードをrunすると、['price', 2, 'exchange', 110, 'tax', 0.13, 'totalprice', 248.59999999999997]というリストが返される

 また、リストの中で計算もできます。

list=[4/2,"d"*4,5+1]print(list)#上記のコードをrunすると、[2.0, 'dddd', 6]を返す。
#リスト内での計算もできる
#"d"は文字列なので、4倍すると"dddd"となる

2. リスト内データの抽出(サブセット)

 さて、これでリストの作成の仕方は分かりました。しかし、分析を行うためにはリストをただ作れるだけでなく、そこからさらに分析に使用するデータを抜き出してくる操作が必要となります。このデータの抽出のことをサブセットと呼びます。リスト内のデータを抽出するためにはインデックスを使用します。例えば、先ほどのpriceを見てみましょう。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]

 このリストの1番最初のデータには0というインデックスが、2番目のデータには1というインデックスが割り当てられています。ここで、ItemCの価格のデータはこのリストの6番目に位置しますので、そのデータには5というインデックスが割り当てられています。
 そして、各インデックスのデータを参照したい場合は各括弧"[]"を用いて、
 リスト名[インデックス]
 と記述します。以下の例をご参照下さい。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price[5]#このコードをrunすると、インデックスが5のデータ(13)を返す
#インデックスが5のデータは左から6番目

 勿論、price[6]と記述した場合は7番目の"ItemD"が返されます。
 また、負の数をインデックスとして使用することもできます。負の数を用いた場合、参照するデータはリストの最後からn個目のデータとなります。
 例えば、ItemDの価格はリストの1番最後に位置するので、以下のように記述することもできます。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price[-1]#このコードをrunすると、リストの最後のデータ(1.15)を返す
#負の数のインデックスはリストの最後からn番目を表す
#price[7]でも同じく、1.15を返す

 勿論、抽出したデータは以下のようにそのまま計算を行うことができます。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]print(price[1]+price[3])#このコードをrunすると、4.5を返す
#price[1]=2
#price[3]=2.5

 さて、リストから要素を抽出する方法はインデックスで1つだけ指定する、という方法だけではありません。リストの範囲を指定し、その範囲に含まれているデータだけを抽出し、新しいリストを作ってしまうというやり方もあります。これをスライスと呼びます。
 インデックスによるリストの抽出では、角括弧[]を利用しましたが、今回は角括弧の他にコロンを使用します。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price[3:5]

 さて、このコードをrunするとどのような答えが返ってくるでしょうか? おそらくインデックスの3から5の要素、つまり、[2.5, "ItemC", 13]を返すのではないかと予想できます。しかし、実際に帰ってくるのは以下です。

[2.5,"ItemC"]

 御覧の通り、インデックス3と4のデータだけのリストになり、インデックスが5のデータは含まれてはいません。
 つまり、リストのデータをスライスして新しいデータリストを作る際には、角括弧とコロンを用いて、
 [始まり(含む):終わり(含まない)]
 と記述する必要があるのです。

 ちなみにですが、スライスするにあたって、最初からデータを指定したいとき(つまり、インデックス0がスタート)、もしくは、最後までデータを指定したいときは、インデックスを省略することも可能です。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price[:4]#インデックスの0は省略可能
#上記をrunすると["ItemA", 2, "ItemB", 2.5]を返す。
price[3:]#上記をrunすると[2.5, "ItemC", 13, "ItemD", 1.15]を返す。
price[:]#上記をrunすると["ItemA", 2, "ItemB", 2.5, "ItemC", 13, "ItemD", 1.15]とpriceのリスト全てを返す。

 では、今まで学んだことを少し組み合わせて応用してみましょう。
 以前、以下のようなリストの中にリストを作るということをやってみました。

price=[["ItemA",2],["ItemB",2.5],["ItemC",13],["ItemD",1.15]]

 ではここで、price[1][-1]と入力したら何が返ってくるのでしょうか?
 答えは、以下のようになります。

price=[["ItemA",2],["ItemB",2.5],["ItemC",13],["ItemD",1.15]]price[1][-1]#上記をrunすると2.5を返す。
#まず、price[1]が処理される。最初のリストの中でインデックス1に該当する要素は["ItemB", 2.5]
#次に、[-1]が処理される。["ItemB", 2.5]の中で一番最後の要素は2.5
#よって2.5が返される

3. リストの編集・追加・削除

 さて、これでリストの作り方とそのリスト内データの抽出の方法は分かりました。ここからは、更に一歩進んでリスト内のデータを編集したり追加、削除したりする方法などを見ていきましょう。
 リストのデータの編集を行うには、サブセットを行ったときと同じように角括弧[]を使用し、以下のように記します。
 リスト名[編集したいデータのインデックス] = 編集後のデータ
 例えば、priceのリストのデータの内、ItemDの価格が1.15ドルから2ドルに変化したとしましょう。このままではリスト内のデータが正しくありませんので、1.15を2に修正する必要があります。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]#priceの元々のリスト
price[7]=2#[]と=を使用して、上記のように記すと、データが更新される
#更新後のリストの中身は["ItemA", 2, "ItemB", 2.5, "ItemC", 13, "ItemD", 2]

 編集する箇所が沢山ある場合、1つずつ変更するのも大変です。そんなときには、コロン(:)を使用して、一気に範囲を指定して編集することも可能です。以下の例ではItemAが新バージョン(ItemA_2)に変化し、値段も2ドルから2.25ドルに値上げした時の例です。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]#priceの元々のリスト
price[0:2]=["ItemA_2",2.25]#更新後のリストの中身は["ItemA_2", 2.25, "ItemB", 2.5, "ItemC", 13, "ItemD", 2]

 さて、データの編集の次にはデータの追加・削除のやり方についてです。
 さて、前回String(文字列)の足し算とinteger(数値)の足し算では結果が異なることについて触れました。各データ型によって足し算の処理が異なりますが、list型のデータを足すことで、リストをさらに追加することができます。試しに、priceのリストに、新しく1.25ドルのItemEを加えてみましょう

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]#priceの元々のリスト
price+["ItemE",1.25]#priceのlistに対して、別のlistを足す
price_ver2=price+["ItemE",1.25]#このように、データを追加し、新しいリストにすることもできる
2.5,"ItemC",13,"ItemD",2]

 さて、これがリストにデータを追加する方法です。それでは、データの削除はどうすればよいでしょうか? 削除も非常に単純で、delというコードを使用して以下のように書きます。
 del(リスト名[インデックス名])
 では、試しにリストからItemBを消してみましょう

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]#priceの元々のリスト
del(price[2])#インデックスが2のデータをリストから削除
#新しいリストは["ItemA", 2, 2.5, "ItemC", 13, "ItemD", 1.15]となる

 一つ注意すべき点は、リストの途中のデータを削除すると、それ以降のデータのインデックスも削除したデータに合わせてずれていくという点です。例えば上の例では、削除する前のItemCのインデックスは4でしたが、インデックス2のItemBが削除されたことにより、ItemCのインデックスは3になります。そのため、もう一度del(price[2])を実行すると、今度は新しいリストのインデックス2の要素、すなわち2.5が削除されます。

4. リストの動作原理

 ここで実際にリストがどのように動いているのかを説明します。少し概念的なお話になり抽象度が上がりますが、大事なことです。
 さて、以下のリストを作成すると裏ではどのようなことが行われているのでしょうか。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]

 実は、リストを作成した際には各要素がpriceという変数に格納されているわけではありません。リストを作成した際に、このリストはコンピュータのメモリに保存されます。そして、そのリストのアドレス(コンピュータのメモリのどこにあるか)がpriceという変数に保存されているのです。つまり、price(変数)にはリストの各要素が保存されているのではなく、リストのアドレスが保存されていることになります。基本的な操作を行う上ではこのことはそれほど重要ではありませんが、リストのコピーを行う際にはこの考え方が重要になってきます。
 具体的に例を用いて説明します。
 priceのリストを新しくprice2というリストに格納し、price2のリストのItemBをItemEに変えてしまいます。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price2=priceprice2[2]="ItemE"#インデックス2のデータ(ItemB)をItemEに変更

 さて、この時点ではprice2のリストは
 ["ItemA", 2, "ItemE", 2.5, "ItemC", 13, "ItemD", 1.15]
 となっています。price2[2] = "ItemE"の操作で、ItemBをItemEに変更したからですね。
 そして本来であれば、priceのリストには何も変更を施していないわけですから、priceのリストは
 ["ItemA", 2, "ItemB", 2.5, "ItemC", 13, "ItemD", 1.15]
 となっているはずです。しかし、実際にはpriceの中身は
 ["ItemA", 2, "ItemE", 2.5, "ItemC", 13, "ItemD", 1.15]
 となっているのです。
 お分かりでしょうか? priceもprice2も、あくまで中身はリストの要素ではなく、リストがコンピュータメモリのどこに保存されているかの場所なのです。price2 = priceの操作で、price2に格納されたのは、あくまでpriceのリストの場所であり、price2のデータを編集してしまえば、当然同じ場所にあるpriceのデータ自体も編集されてしまうのです。priceとprice2と変数は2つありますが、実際に存在するリストは1つだけなのです。
 では、実際に同じ要素もつ別のリストを作成したいときはどうすればよいのでしょうか? その際には以下のようにlist関数を使用します。また、先ほどご紹介したリストの全要素を選択する[:]を使用して、price2のリストを作ってしまうという方法もあります。

price=["ItemA",2,"ItemB",2.5,"ItemC",13,"ItemD",1.15]price2=list(price)#別のリストを作成するoption1
price2=price[:]#別のリストを作成するoption1

 こうしてしまえば、別のリストを作成してしまったことになるため、price2のリストを編集してもpriceのリストには影響を与えずに済みます。

 以上、今回はPythonのリストについてのお話でした!


Viewing all articles
Browse latest Browse all 21499

Latest Images

Trending Articles