カネキン伊藤テック

listの使い方

新しいリストを作る

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  #=> ["?", "?", "?", "?", "?"]

参考リンク