2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python]リストの最後から順に取り出す

Last updated at Posted at 2021-01-22

はじめに

気まぐれでアルゴリズムの問題を解くことがあるのですが、このときは普段利用しないPythonを選択しています。
その中で、Pythonにおいて「リストの最後から順に要素を取り出す」という操作をどうしたらいいのかで悩みました。

Python自体、めったに利用することがなく、基本的なfor文の書き方すら頭から抜け落ちることもあるため、
基礎から学び直しつつ、最後に「リストの最後から順に要素を取り出す」にチャレンジします。

また、こちらは、エンジニアの新たな学びキャンペーンに向けた記事となります。

まず基本的なfor文から

for 変数 in データの集まり:
実行する処理

[【基礎を全解説】はじめての人の無料で学べるPython超入門!](https://www.udemy.com/course/python-free-intro/)

適当なリストを作成し、そのリストについて操作してみます。

```python
a = ["hoge", "foo", "bar", "fuga"]
for i in range(4):
    print(a[i])
# hoge
# foo
# bar
# fuga
for i in range(len(a)):
    print(a[i])
# hoge
# foo
# bar
# fuga

拡張for文のように書く

他言語でいうところの拡張for文のように処理することもできます
ここではiはインデックスではなく、リスト内のリテラルとなります

for i in a:
    print(i)
# hoge
# foo
# bar
# fuga

飛ばし飛ばしで要素を取得する

print(list(range(0, 10, 3)))

[0, 3, 6, 9]

[Pythonのfor文によるループ処理(range, enumerate, zipなど)](https://note.nkmk.me/python-for-usage/)


0を出発点、10を終了点として、3飛ばしで要素を取得することができるメソッドのようです。


# リストの最後から次々に取り出す

前述 [#飛ばし飛ばしで要素を取得する](#飛ばし飛ばしで要素を取得する)を利用して、
リストの最後のインデックスを出発点、リストの最初を到達点、-1ずつ飛ばしていくという引数指定をしてみます。


```py
a = ["hoge", "foo", "bar", "fuga"]
for i in range(len(a), 0, -1):
    print(a[i])

# Traceback (most recent call last):
#  File "Main.py", line 3, in <module>
#     print(a[i])
# IndexError: list index out of range

エラー文を読むと、リストのインデックスの当て方が間違っていたようです。

今回はリストの個数は4ですが、厳密には0番から3番目までに要素が格納されています。
従って、出発点はlen(a)-1ではないかと想像します。
また、第二引数である到達点について、「この数字に達する直前の数」まで適用するため、ここに記載すべきは0ではなく-1であると想像します。

そこで以下のようなソースコードに書き換えました。

a = ["hoge", "foo", "bar", "fuga"]
for i in range(len(a)-1, -1, -1):
    print(a[i])

# fuga
# bar
# foo
# hoge

「リストの最後から順に取り出す」という、意図していた挙動が確認できました。
しかし-1が引数に複数含まれていて、なんとも見づらいですね。

リストの最後から次々に取り出す(別解)

別解というよりもこちらのほうがスタンダードな気配さえするのですが、
reverseでリストの順序を逆転させることができるようで、これを使えばさらに簡単に目的が達成できそうです。
とはいえ、もともと用意していたリストの順序そのものが変わってしまうので、一癖はあるのかなと感じます。

a = ["hoge", "foo", "bar", "fuga"]
a.reverse()
for i in a:
    print(i)

もとのリストの順序を変えずに済む方法も、こちらに紹介されていたので、これに沿って書き直してみます。

a = ["hoge", "foo", "bar", "fuga"]
for i in reversed(a):
    print(i)
print(a)

# fuga
# bar
# foo
# hoge
# ['hoge', 'foo', 'bar', 'fuga']

おわりに

Udemy学習応援ということで、本記事で扱ったUdemy講座の内容について、最後に触れます。

『【基礎を全解説】はじめての人の無料で学べるPython超入門!』はタイトルの通り、初心者向けの講座となっています。
他言語を少しやったことのある人向けというよりは、今からプログラム言語に初めて触れる人を対象にしており、
環境構築の方法や、変数とは何か?といったところから解説されていて、本当に土台から学べるコースになっています。

さらに無料であることも大きなポイントかと思います。

他言語の習得済みの方にとっては物足りない内容だろうなと感じる一方で、
真に初心者な方にとっては強力な教材であると感じます。

このコースの習得後に、例えばPaizaのPythonコースといった、初心者向けでありながらも やや発展的&演習問題つきの教材、
あるいは私は存じ上げないのですがUdemyの発展的教材に向かうのが良いかなと思います。

参考

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?