listは、順序 を持つ要素の可変コレクションです。ほとんどのコレクション(組み込みのtuple、dict、setを参照)と同様に、配列は他の配列も含め、任意の(あるいは複数の)データ型への参照を保持できます。配列は、スライス記法を使うか、<list>.copy()を使うことで、全体または一部をコピーできます。他のシーケンス型と同じく、lists内の要素は、左からの0-based index番号、または右からの-1-based index番号で参照されます。
配列は、共通のシーケンス操作と可変シーケンス操作の両方をサポートしており、たとえばmin(<list>)/max(<list>)、<list>.index()、<list>.append()、<list>.reverse()などがあります。list内の要素は、for item in <list>という構文で繰り返し処理できます。要素のインデックスと値の両方が必要な場合は、for index, item in enumerate(<list>)を使えます。
Pythonには、配列を扱うための便利な配列のメソッドも多数用意されています。ここでは、その中の一部のlist methodsを紹介します。
listをlist-methodで操作すると、渡された配列オブジェクトそのものが変更される点に注意してください。元のlistを変更したくない場合は、少なくともスライスか<list>.copy()を使ってshallow copyを作る必要があります。
既存の配列の末尾(「右端」)に要素を追加するには、<list>.append(<item>)を使います:
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
単に_追加_するのではなく、<list>.insert()を使えば、配列内の_特定のインデックス_に要素を追加できます。引数は2つです:
<index>。<item>。注意:指定したindexが0の場合、要素はlistの先頭(「左端」)に追加されます。指定したindexがlistの最後のindexより大きい場合、要素は最後の位置に追加されます。これは<list>.append(<item>)を使った場合と同じです。
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
<list>.extend(<item>)を使うと、既存の配列に、別のイテラブル(たとえばset、tuple、str、list)の要素を組み合わせられます。イテラブルは_展開_ され、要素が順番に追加されます(この場面で<list>.append(<item>)を使うと、イテラブル全体が1つの要素として追加されてしまいます)。
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
>>> numbers.append([8,9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]
配列から要素を削除するには、<list>.remove(<item>)を使い、削除したい要素を引数として渡します。<list>.remove(<item>)は、その要素がlistに存在しない場合、ValueErrorを送出します。
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
別の方法として、<list>.pop(<index>)メソッドを使うと、要素を削除すると同時にその要素をreturnして利用できます。
<list>.pop(<index>)は省略可能な引数を1つ取ります。削除して返す要素のindexです。(省略可能な)index引数を指定しない場合、listの最後の要素が削除されて返されます。指定したindexが最後の要素のindexより大きい場合、IndexErrorが発生します。
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
list.clear()を使えば、listからすべての要素を削除できます。引数はありません。
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
<list>.reverse()メソッドは、要素の順序をその場で逆にします。
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
配列は、<list>.sort()を使うと その場で 並べ替えられます。デフォルトの並べ替え順は、左からの_昇順_です。Pythonのドキュメントには、並べ替えに関する追加のヒントとテクニックが紹介されています。
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
降順 にしたい場合は、reverse=Trueを渡します:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
元の配列を変更したくない場合は、組み込みのsorted(<iterable>)関数を使って、並べ替え済みのコピーを返すことができます。
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']
配列内にある要素の出現回数は、list.count(<item>)を使うと数えられます。数えたいitemを引数に取り、その要素がlistに現れる合計回数を返します。
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
<list>.index(<item>)は、渡された要素が_最初に出現する_位置のindex番号を返します。出現しない場合は、ValueErrorが発生します。要素の正確な位置が必要ない場合は、組み込みのin演算子を使うほうが、配列に特定の値が含まれているかを調べるのに効率的です。
インデックスは左から0始まりなので、「最初」の要素の位置は0です。インデックスは右からも数えられ、-1から始まります。
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
startとendのインデックスを指定して、listの特定の範囲に検索を絞ることもできます:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
チェイタナは、とても人気のあるテーマパークを経営しています。 美しく手入れされた敷地のちょうど中央に、アトラクションが1つだけあります。「世界一大きなジェットコースター(TM)」です。 アトラクションはこれ1つだけですが、世界中から人々が訪れ、チェイタナのハイパーコースターに乗るために何時間も列に並びます。
この乗り物には2つの列があり、それぞれがlistで表されます。
公園のゲストをよりよく管理するためのコードを書くよう頼まれました。 ゲスト(そして上司のチェイタナ!)が不機嫌になる前に、できるだけ早く次の関数を実装する必要があります。 よく読んでください。 タスクによっては既存の列を変更・更新するものが、また別のタスクではそのコピーを作るものが求められます。
add_me_to_the_queue()関数を定義します。この関数は4つの引数<express_queue>, <normal_queue>, <ticket_type>, <person_name>を受け取り、その人の名前を追加した適切な列を返します。
<ticket_type>はintで、1がexpress_queue、0がnormal_queueを表します。<person_name>は、それぞれの列に追加する人の名前(str)です。>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]
ある人は公園に遅れて到着しましたが、友達が待っている列に加わりたいと思っています。 しかし、友達がどこに並んでいるのか見当もつかず、電話をかけたくても電波がありません。
find_my_friend()関数を定義します。この関数は2つの引数queueとfriend_nameを受け取り、その人の名前が列の何番目にあるかを返します。
<queue>は、列に並んでいる人々のlistです。<friend_name>は、インデックス(列の何番目か)を探す友達の名前です。覚えておきましょう。インデックスは左から0、右から-1で始まります。
>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1
友達が見つかったので(前述のタスク2)、遅れて来た人は友達と同じ列の位置に加わりたいと思っています。
add_me_with_my_friends()関数を定義します。この関数は3つの引数queue、index、person_nameを受け取ります。
<queue>は、列に並んでいる人々のlistです。<index>は、新しい人を追加する位置です。<person_name>は、そのインデックスの位置に追加する人の名前です。遅れて来た人の名前を追加した列を返します。
>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
列から、押しのけたり大声を出したりして迷惑をかけている、とても意地悪な人がいると聞きました。 その厄介者を、迷惑行為のために追い出さなければなりません!
remove_the_mean_person()関数を定義します。この関数は2つの引数queueとperson_nameを受け取ります。
<queue>は、列に並んでいる人々のlistです。<person_name>は、追い出す必要がある人の名前です。意地悪な人の名前を取り除いた列を返します。
>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]
他人同士がまったく同じ見た目をしているのを見たことはないかもしれませんが、他人同士がまったく同じ名前(同名の人)であるのは_絶対に_見たことがあるはずです! 今日は、そんな人がたくさん来ているようです。 ある特定の名前が列の中に何回出てくるのか知りたくなります。
how_many_namefellows()関数を定義します。この関数は2つの引数queueとperson_nameを受け取ります。
<queue>は、列に並んでいる人々のlistです。<person_name>は、列の中に複数回出てくるかもしれないと思う名前です。person_nameが出てくる回数をintとして返します。
>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2
残念ながら、今日は公園が混み合っていて、通常の列の最後の人を削除する必要があります(その人には、別の日にファストトラックで戻ってこられる引換券を渡します)。
関数remove_the_last_person()を定義する必要があります。この関数は1つの引数queueを受け取ります。queueは列に並んでいる人々のリストです。
listを更新し、削除した人の名前もreturnする必要があります。そうすれば、その人に引換券を書けます。
>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'
管理上の目的で、ある列のすべての名前をアルファベット順に取得する必要があります。
sorted_names()関数を定義します。この関数は1つの引数queue(列に並んでいる人々のlist)を受け取り、sortedされたlistのコピーを返します。
>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']