[Python3] 後ろから2番目の要素から1つおきに2倍する

2020-05-19Python3CS50

数値リストの後ろから 2 番目の要素から 1 つおきずつ要素を 2 倍していく方法。
例えば、[1, 2, 3, 4, 5] というリストがあったら、 2 と 4 を 2 倍したい。

リストや文字列から、指定した要素範囲内から、要素を選択 ( 取り出す ) することをスライシングという。また、インデックスを指定して要素を選択することをインデキシングという。

スライシング

スライシングの書き方

[開始インデックス : 終了インデックス : 増分値]

  • 増分値のデフォルトは 1
  • 開始インデックスと終了インデックスは省略可能で、開始インデックスのデフォルトは先頭から、終了インデックスのデフォルトは末尾まで
  • 開始インデックスは 0 始まり
  • 終了インデックスに指定する値は、未満という扱いになる
  • インデックスに負の整数を指定すると末尾から、増分値に指定すると逆順となる
  • 増分値に 0 は指定できない

2 番目の要素から 1 つおきに要素を取得

まずスライシングで 2 番目の要素から 1 つおきに要素を取得していく。
増分値を 2 にすると正順となり要素は 1 つしか取得できない。

num_list = [1, 2, 3, 4, 5, 6, 7, 8]

# 後ろから 2 番目の要素から 1 つおきに逆順していく
print(num_list[-2::-2])
# 出力:[7, 5, 3, 1]

# 後ろから 2 番目の要素から 1 つおきに後ろにいく (ので 1 つしか取得できない)
print(num_list[-2::2])
# 出力:[7]

他のサンプル

# 後ろから 1 番目の要素から 1 つずつ逆順
print(num_list[::-1])
# 出力:[8, 7, 6, 5, 4, 3, 2, 1]

# 前から 2 番目の要素から 1 つおき
print(num_list[1::2])
# 出力:[2, 4, 6, 8]

# 前から 4 番目まで ( 5 番目未満まで )
print(num_list[:4])
# 出力:[1, 2, 3, 4]

# 3 番目の要素から 5 番目まで ( 2 から 5 未満 )
print(num_list[2:5])
# 出力:[3, 4, 5]

リストの全要素を 2 倍する

リスト内包表記 ( [..for..in..] のところ ) を使った。 for でも map とか使ってもできるよ。

multiply_list = [i*2 for i in every_other]

num_list = [1, 2, 3, 4, 5, 6, 7, 8]
every_other = num_list[-2::-2]
print(every_other)
# 出力:[7, 5, 3, 1]

multiply_list = [i*2 for i in every_other]
print(multiply_list)
# 出力:[14, 10, 6, 2]

リスト内包表記については、こちらの解説が分かりやすかった。

Posted by Agopeanuts