Pythonでリストのforループでインデックスと要素の両方を取り出して繰り返す方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Pythonで初心者でも簡単にできるクリックボードを使ったツールの作り方をお伝えしています。

前回の記事はコチラ。

初心者でも簡単!Pythonでデータを加工してクリップボードにコピーをする方法
Pythonでクリップボードを操作して便利ツールを作る方法を初心者向けにお伝えしております。Pythonでデータを加工してクリップボードにコピーするpyperclip.copyの使い方です。

クリップボードを操作するモジュールpyperclipを使って、クリップボードのデータをMarkdownのリスト形式に加工してクリップボードに戻すというツールを作成しました。

今回、そのツールをちょっと修正して、Markdownの番号付きリスト形式にしてみたいと思います。

そのためには、forループでインデックス番号を上手に取り出す必要があるのです。

ということで、今回はPythonのリストのforループで要素とともにインデックス番号も取り出す方法についてお伝えします。

では、行ってみましょう!

スポンサーリンク

前回のおさらいと今回のお題

前回作成したたのは以下のプログラムです。

import pyperclip
lines =pyperclip.paste().split()
text = ''
for line in lines:
    text = text + '- ' + line + '\r\n'
pyperclip.copy(text)

以下のような処理になりますね。

  1. クリップボードのデータを取り出して空白文字(今回の場合は「\r\n」)で分割、リスト化
  2. forループでリストの要素を取り出し、それぞれの先頭に「- 」を追加しながら連結
  3. クリップボードに連結したテキストをコピーして戻す

Markdownの番号付きリストに加工したい

Markdownでは、ただのリストであれば、各要素の冒頭にハイフンと半角スペースを入力すればよかったのですが、番号付きリストの場合は

1. リスト1
2. リスト2

というように、「番号+ピリオド+半角スペース」という形にします。

その部分をPythonで付与してクリップボードに戻してあげようということです。

(実は、番号は増やさなくて、ずっと番号1つまり「1. 」でも番号付きリストは作れちゃうのですが…それだと簡単すぎるので、ちゃんと数を増やしていきます)

forループでリストのインデックスと要素を取り出す方法

さて、番号付きリストを作りたいので、番号が必要です。

リストでいうとインデックスを使えばいいのですが、上記プログラムに使っている以下のforループ構文では、インデックスを取り出す機能がありません。

for 変数 in リスト:
  # 処理

さて、どうすればよいですかね。

なお、リストに対するforループに関しては以下記事もご覧ください。

Pythonでデータをまとめて取り扱う基本中の基本!リストの使い方とforループ
初心者向けにフォルダ操作を題材としてPythonプログラミングの基本中の基本についてお伝えしています。今回はPythonでデータをまとめて取り扱うリストについてその基本とforループにより繰り返しついてです。

len関数によるリストの要素数を使う

ちょっと原始的な方法で、リストの要素数をrange関数に使用するという方法があります。

以下の構文の終了値に、リストの要素数を使用してあげるという作戦ですね。

for 変数 in range([開始値], 終了値[, ステップ]):
  # 処理

range関数を使ったforループに関しては以下記事もご参考下さい。

Pythonプログラミングの基本中の基本!forループによる繰り返しの作り方
一般ビジネスマンの初心者向けフォルダを操作するツールを作りながらPythonの基本を学ぶシリーズ。今回は、Pythonプログラミングの基本、forループとrange関数による繰り返し処理の作り方です。

さて、リストの要素数はlen関数を使って以下のように取得することができます。

len(リスト)

ですから、以下のようにすればインデックスと要素を両方取り出すことができるわけですね。

import pyperclip
lines =pyperclip.paste().split()
for i in range(len(lines)):
    print(str(i) + ":" + lines[i])

変数iのデータ型は数値ですから、str関数で文字列に変換してます。変換しないと、異なるデータの連結をすることになり、Pythonではエラーになっちゃいます。

さて、実行すると以下のような結果が得られます。

Pythonのリストのforループでインデックスと要素を取り出す

enumerate関数でインデックスと要素を両方取り出す

これはこれで良い気もしますが、実はPython。もっとスマートな方法があります。

forループでリストに対してenumerate関数を使うと、インデックスと要素を両方取り出すことができるのです。

以下のように書きます。

for 変数1,変数2 in enumerate(リスト):
  # 処理

繰り返しの際に、変数1にインデックス、変数2にそのインデックスの要素が格納されます。

これを使って、先ほどと同じ出力のプログラムを作成しますと、以下のようになります。

import pyperclip
lines =pyperclip.paste().split()
text = ''
for i,line in enumerate(lines):
    print(str(i) + ":" + line)

先ほどのrange関数、len関数を使った例と同様の出力結果を得ることができます。

クリップボードのデータをMarkdownの番号付きリストに変換する

では、これを使ってクリップボードのデータをMarkdownの番号付きリストに変換するプログラムを作りました。

import pyperclip
lines =pyperclip.paste().split()
text = ''
for i,line in enumerate(lines):
    text = text + str(i+1) + '. ' + line + '\r\n'
pyperclip.copy(text)

リストのインデックスは0から始まるので、プラス1をしていますよ。

範囲選択してクリップボードにある状態で上記プログラムを実行して、それをペーストすると以下のようになりました。

Pythonでクリップボードの内容を番号付きリストに変換

はい、望み通りです。

まとめ

Pythonでリストのforループをするときに、インデックスと要素の両方を取り出す方法でした。

enumerate関数…素敵すぎますね。ほんとスマートです。

ぜひ、活用しましょう!

さて、スマートと言えば、今回のコードでもprint関数やテキストの生成など文字列の連結のステートメントがちょっとスマートじゃないですよね…

次回はクリップボードと直接関係ないのですが、文字列への値の埋め込みというテクニックをお伝えします。

Pythonで文字列の中に変数などの値を埋め込むformatメソッドの使い方
Pythonでクリップボードを使った便利ツールを作る非エンジニア&Windowsユーザー向けのシリーズです。今回はPythonで文字列の中に変数の値を埋め込むというformatメソッドの使い方をお伝えします。

どうぞお楽しみに!

連載目次:Pythonで簡単作成!クリップボードを使ったツールを作ろう

一般ビジネスマンの非エンジニア向けにPythonのpyperclipモジュールによる、クリップボードを使った簡単便利ツールの作り方をお伝えします。Webページやテキストファイルからコピーしたテキストを加工して貼り付ける…といったことが可能になります。超便利です。
  1. Pythonでクリップボードを操作!pyperclipを使ってコピーしたデータを取得する
  2. 初心者でも簡単!Pythonでデータを加工してクリップボードにコピーをする方法
  3. Pythonでリストのforループでインデックスと要素の両方を取り出して繰り返す方法
  4. Pythonで文字列の中に変数などの値を埋め込むformatメソッドの使い方
  5. Pythonでクリップボードの内容をExcelに貼り付けられるように変換するスクリプト
  6. Pythonでテキストファイルに追加で書き込みをする基本中の基本
  7. Pythonでcsvファイルにデータを書き込みをする基本中の基本

タイトルとURLをコピーしました