みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Pythonで初心者でも簡単にできるクリックボードを使ったツールの作り方をお伝えしています。
前回の記事はコチラ。
クリップボードを操作するモジュール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)
以下のような処理になりますね。
- クリップボードのデータを取り出して空白文字(今回の場合は「\r\n」)で分割、リスト化
- forループでリストの要素を取り出し、それぞれの先頭に「- 」を追加しながら連結
- クリップボードに連結したテキストをコピーして戻す
Markdownの番号付きリストに加工したい
Markdownでは、ただのリストであれば、各要素の冒頭にハイフンと半角スペースを入力すればよかったのですが、番号付きリストの場合は
2. リスト2
…
というように、「番号+ピリオド+半角スペース」という形にします。
その部分をPythonで付与してクリップボードに戻してあげようということです。
(実は、番号は増やさなくて、ずっと番号1つまり「1. 」でも番号付きリストは作れちゃうのですが…それだと簡単すぎるので、ちゃんと数を増やしていきます)
forループでリストのインデックスと要素を取り出す方法
さて、番号付きリストを作りたいので、番号が必要です。
リストでいうとインデックスを使えばいいのですが、上記プログラムに使っている以下のforループ構文では、インデックスを取り出す機能がありません。
# 処理
さて、どうすればよいですかね。
なお、リストに対するforループに関しては以下記事もご覧ください。
len関数によるリストの要素数を使う
ちょっと原始的な方法で、リストの要素数をrange関数に使用するという方法があります。
以下の構文の終了値に、リストの要素数を使用してあげるという作戦ですね。
# 処理
range関数を使ったforループに関しては以下記事もご参考下さい。
さて、リストの要素数はlen関数を使って以下のように取得することができます。
ですから、以下のようにすればインデックスと要素を両方取り出すことができるわけですね。
import pyperclip
lines =pyperclip.paste().split()
for i in range(len(lines)):
print(str(i) + ":" + lines[i])
変数iのデータ型は数値ですから、str関数で文字列に変換してます。変換しないと、異なるデータの連結をすることになり、Pythonではエラーになっちゃいます。
さて、実行すると以下のような結果が得られます。
enumerate関数でインデックスと要素を両方取り出す
これはこれで良い気もしますが、実はPython。もっとスマートな方法があります。
forループでリストに対して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でリストのforループをするときに、インデックスと要素の両方を取り出す方法でした。
enumerate関数…素敵すぎますね。ほんとスマートです。
ぜひ、活用しましょう!
さて、スマートと言えば、今回のコードでもprint関数やテキストの生成など文字列の連結のステートメントがちょっとスマートじゃないですよね…
次回はクリップボードと直接関係ないのですが、文字列への値の埋め込みというテクニックをお伝えします。
どうぞお楽しみに!