listの使い方
Table of contents
新しいリストを作る
a = [1, 2, 3] # 好きなだけならべる
b = [] # 空のリスト
Perl(リファレンス), Ruby, JavaScriptなどと同じ。
リストの末尾に値を追加する
# 単一の値を追加する
a = [1, 2, 3]
a.append(4) # => [1, 2, 3, 4] になる
a.append("five") # => [1, 2, 3, 4, "five"] になる
# 複数の値を一気に追加
b = []
b.extend(["book", "drink"]) # => ["book", "drink"] になる
リスト同士を合体させて新しいリストを作る
list1 = [1, 2, 3]
list2 = ["a", "b", "c"]
list3 = list1 + list2 # => [1, 2, 3, "a", "b", "c"] になる
リストの途中に値を追加する
values = [111, 222, 333]
values.insert(1, "hello") # => values は [111, "hello", 222, 333] になる
insert()
の第一引数は挿入したいインデックスを指定する。
指定したインデックスの値の(この例だと 222
)の前に入る。
もしくは挿入した値(この例だと "hello"
)がもつことになるインデックスを指定する、と理解してもよさそう。
リストの要素を順番に処理する
# forで普通にループ
values = [1, 2, 3]
for item in values:
print(item)
# indexが欲しいときはenumerateが便利
values2 = ["い", "ろ", "は"]
for index, item in enumerate(values2):
print("item at index=%d is %s" % (index, item))
# whileで無理やり書く
values3 = ["a", "b", "c"]
index = 0
while index < len(values3):
item = values3[index]
print(item)
index += 1
すべての要素に対して処理を適用し加工する
リスト内包表記が一番良く使われる方法だろう。
# リスト内包表記
numbers = [10, 20, 30]
sanbai_numbers = [n * 3 for n in numbers]
# map関数
numbers2 = [11, 22, 33]
yonbai = lambda n: n * 4
yonbai_numbers_iterator = map(yonbai, numbers2)
yonbai_numbers = list(yonbai_numbers_iterator)
map()
関数はイテレータを返すのでリストとして欲しい場合は list()
で変換する。 for
などでそのまま処理する場合は変換しなくても使える。
リストの長さを得る
len(a) # => 5 を得ることができる
print(len(a)) # => 5 が出力される
リストの内容にアクセスする(インデックス)
c = [10, 20, 30, 40, 50]
c[0] # => 10 を得る
c[2] # => 30 を得る
c[-1] # => 末尾のほうからアクセスできる。 50 を得る
c[-2] # => 40を得る
リストの部分リストを得る(スライス)
d = [10, 20, 30, 40, 50]
d[:3] # [10, 20, 30] を得る。最初の3個を得る
d[:-3] # [10, 20] を得る。後ろから三つ目までの部分を得る。
d[1:3] # => [20, 30] を得る。 [i:j] のとき部分リストの長さは j - i
e = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
e[1:9:2]
# [2, 4, 6, 8] を得る。
# e[1:9] で得られる長さ8のリストを2ごとに1つとって作られる
中に要素があるかを確認する
names = ["花子", "太郎", "金之助"]
is_hanako_included = "花子" in names # => True が代入される
if "仗助" in names:
print("いる")
else:
print("いない")
# => "いない" が出力される
線形探索になるのでたくさん要素数がある中から存在をチェックする場合はループでたくさん実行したりすると遅い場合がある。( set
の使用を検討。)
中身を逆順にする
a = ["牛肉", "鶏肉", "豚肉"]
a.reverse() # => ["豚肉", "鶏肉", "牛肉"] になっている
# 逆順にした新しいリストを作る
b = ["ぎゅう", "とり", "ぶた"]
reversed(b) # => ["ぶた", "とり", "ぎゅう"] を得る, bの内容/順序は変わらない
中身をソートする
a = [4, 5, 2, 3, 1]
a.sort() # => [1, 2, 3, 4, 5]になる, 昇順にソートされる。
b = [20, 30, 10, 40, 50]
b.sort(reverse=True) # => [50, 40, 30, 20, 10] になる
c = [300, 100, 200]
sorted(c) # => 新しいリスト [100, 200, 300] を得る, cは変わらない
# 評価関数を指定する
trains = [
{"name": "リニア", "speed": 500},
{"name": "在来線", "speed": 100},
{"name": "新幹線", "speed": 300},
{"name": "特急", "speed": 150}
]
trains.sort(key=lambda item: item["speed"])
tuple 型に変換する
list_values = [1, 2, 3]
tuple(list_values) # => (1, 2, 3) を得る
tuple
型は list
型と違って要素を追加したり削除したりできない。
そのかわり dict
のキーに使ったりすることができる。
キュー(FIFO)を作る
無理に list
を使うのではなく collections.deque
などを使ったほうがすっきりする。
collections
は標準ライブラリなので何かをインストールしなくても使える。
from collections import deque
my_queue = deque()
my_queue.append(1)
my_queue.append(2)
my_queue.popleft() # => 1
my_queue.popleft() # => 2
スタック(FILO)を作る
無理に list
を使うのではなく collections.deque
などを使ったほうがすっきりする
from collections import deque
my_stack = deque()
my_stack.append(1)
my_stack.append(2)
my_stack.pop() # => 2
my_stack.pop() # => 1
要素を検索してインデックスを得る
names = ["佐藤", "後藤", "須藤", "加藤", "伊藤", "江藤"]
ito_index = names.index("伊藤") # => 4 を得る
hyodo_index = names.index("兵藤") #=> 例外 ValueError が発生
listの内容を繰り返したlistを作る
*
演算子で繰り返す数を指定することでリピートした新しいlistを作れる
list1 = [1, 2, 3]
list2 = list1 * 3 #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
list3 = ["?"]
list4 = list3 * 5 #=> ["?", "?", "?", "?", "?"]