Pythonお悩み解決

Pythonに関する疑問や悩みにこたえるブログです

文字列の長さを求めたい

Pythonで文字列の長さを求める方法を紹介します。

len() 関数を使う

len() 関数を使うことで、文字列の長さを求められます。

以下はそのサンプルコードです。

>>> len("abc")
3
>>> len("あいうえお")
5

まとめ

文字列の長さを求める時は、len() 関数を使いましょう。

辞書をマージ(結合)したい

Pythonで辞書をマージ(結合)する方法を紹介します。

いくつか方法があるので、それぞれ説明します。

演算子 | を使う

Python 3.9以降であれば、辞書をマージするのに演算子|が使えます。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # 演算子 | を使ってマージ
>>> d1 | d2
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> d2 | d1
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

上記の様に、キー値が異なる要素(この場合は k1k3)はそのままマージされます。

また、同じキー値をもつ要素(この場合は k2)については | の後に書いた辞書の要素が優先されます。

なお、| を使っても元の辞書には影響がありません。

>>> # 元の辞書はそのまま
>>> d1
{'k1': 'v11', 'k2': 'v12'}
>>> d2
{'k2': 'v22', 'k3': 'v23'}

元の辞書を更新する演算子 |=

元の辞書を更新したい場合は、演算子|=を使います。

>>> # d1を上書きする
>>> d1 |= d2
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

Python 3.9以降をお使いであれば、||=を使うのが良いでしょう。

辞書のアンパックを使う

辞書のアンパックを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # アンパックを使ってマージ
>>> {**d1, **d2}
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> {**d2, **d1}
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

しかし、この方法は、あまり直感的ではありません。

パッと見ただけでは、2つの辞書をマージしていることが分かりにくいと思います。

update() メソッドを使う

辞書のupdate()メソッドを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # update() メソッドを使ってマージ
>>> d1.update(d2)
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

しかし、update()メソッドは元の辞書を更新してしまうため、元の辞書を変更したくない場合には使えません。

まとめ

Pythonで辞書をマージする方法を紹介しました。

Python 3.9以降であれば、演算子 | |= を使う方法が良いでしょう。

文字列の前後から任意の文字を除去したい: stripメソッド(その2)

今回は文字列の前後から任意の文字を除去する方法を紹介します。

前後から任意の文字を除去する: strip()メソッド

文字列のstrip()メソッドを使うと、文字列の前後(先頭と末尾)から任意の文字を除去できます。

使い方は以下の通りです。

文字列.strip(除去する文字)

実際に使ってみましょう。

>>> s = '!!!こんにちは!!!'
>>> s.strip('!')
'こんにちは'

「こんにちは」の前後にはそれぞれ3つずつ!がありますが、それらが除去されたことを確認できました。

このように、文字列前後の連続する任意の文字がまとめて除去されます。

なお、このメソッドは指定した文字を除去した新しい文字列を返すため、元の文字列sはそのままです。

>>> # 元の文字列は変更されない
>>> s
'!!!こんにちは!!!'
複数の種類の文字を除去する

1つの文字だけでなく、複数の種類の文字の指定もできます。

たとえば!?を除去したい場合は、次のようにstrip('!?')とします。

>>> s = '!!!こんにちは???'
>>> s.strip('!?')
'こんにちは'

文字列の前後にある!?が除去されました。

strip()メソッドは前後の文字を除去しましたが、先頭部分の文字のみ除去したい場合や、末尾部分の文字を除去したい場合もあります。

これにはlstrip()メソッドやrstrip()メソッドが使えます。

先頭から任意の文字を除去する: lstrip()メソッド

文字列の先頭部分から任意の文字を除去したい場合lstrip()メソッドが使えます。

これは以下のように、先頭部分から指定した文字を除去した文字列を返します。

>>> s = '!?!こんにちは?!?'
>>> s.lstrip('!?')
'こんにちは?!?'

末尾から任意の文字を除去する: rstrip()メソッド

文字列の末尾部分から任意の文字を除去したい場合rstrip()メソッドが使えます。

これは以下のように、末尾部分から指定した文字を除去した文字列を返します。

>>> s = '!?!こんにちは?!?'
>>> s.rstrip('!?')
'!?!こんにちは'

なお、lstrip()lleft(左)、rstrip()rright(右)と考えれば覚えやすいです。

空白文字を除去する

これらのメソッドに引数を指定しなかった場合は、空白文字が除去対象となります。

これについてはこちらの記事で解説しています。

python-onayami.com

まとめ

  • 前後から任意の文字を除去するには strip()メソッドを使う
  • 先頭から任意の文字を除去するには lstrip()メソッドを使う
  • 末尾から任意の文字を除去するには rstrip()メソッドを使う

参考

文字列の前後の空白文字を除去したい: stripメソッド

今回は文字列の前後の空白文字を除去する方法を紹介します。

前後の空白文字を除去する: strip()メソッド

文字列のstrip()メソッドを使うと、文字列の前後(先頭と末尾)の空白文字を除去できます。

使い方は以下の通りです。

文字列.strip()

実際に使ってみましょう。

>>> s = '   こんにちは   '
>>> s.strip()
'こんにちは'

「こんにちは」の前後にはそれぞれ3つずつ半角スペースがありますが、それらが除去されたことを確認できました。

このように、文字列前後の連続する空白文字がまとめて除去されます。

なお、このメソッドは空白文字を除去した新しい文字列を返すため、元の文字列sはそのままです。

>>> # 元の文字列は変更されない
>>> s
'   こんにちは   '

strip()メソッドは前後の空白文字を除去しましたが、文字列の先頭部分の空白文字のみ除去したい場合や、末尾部分の空白文字を除去したい場合もあります。

これにはlstrip()メソッドやrstrip()メソッドが使えます。

先頭の空白文字を除去する: lstrip()メソッド

文字列の先頭部分の空白文字のみ除去したい場合lstrip()メソッドが使えます。

これは以下のように、先頭部分の空白文字のみ除去した文字列を返します。

>>> s.lstrip()
'こんにちは   '

末尾の空白文字を除去する: rstrip()メソッド

文字列の末尾部分の空白文字のみ除去したい場合rstrip()メソッドが使えます。

これは以下のように、末尾部分の空白文字のみ除去した文字列を返します。

>>> s.rstrip()
'   こんにちは'

なお、lstrip()lleft(左)、rstrip()rright(右)と考えれば覚えやすいです。

除去対象の空白文字

除去対象の空白文字は半角スペースだけではなく、改行文字やタブ文字も含まれます。

そのため、以下のようにrstrip()メソッドで末尾の改行文字を除去できます。

>>> # 改行文字を含む文字列
>>> s2 = 'こんにちは\n'
>>> s2.rstrip()
'こんにちは'

これはたとえばopen()関数でテキストファイルを開き、for文で1行ずつ処理する場合、strip()rstrip()を使って末尾の改行文字を除去するのに使えます。

with open("sample.txt") as f:
    for line in f:
        # 末尾の改行文字を除去
        line = line.rstrip()
        ...

まとめ

  • 前後の空白文字を除去するには strip()メソッドを使う
  • 先頭の空白文字を除去するには lstrip()メソッドを使う
  • 末尾の空白文字を除去するには rstrip()メソッドを使う
  • 空白文字には改行文字やタブ文字も含まれる

参考

文字列を区切り文字で結合したい: joinメソッド

今回は文字列を区切り文字で結合する方法を紹介します。

join()メソッド

例として、以下のように,で区切られている文字列を考えてみましょう。

a,b,c

文字列を区切り文字で結合するには、文字列のjoin()メソッドを使います。

基本的な使い方は下記の通りです。

区切り文字.join(イテラブル)

イテラブル(iterable)とは、リストのように要素を一度に1つずつ返せるオブジェクトのことです。

結果は、各要素を区切り文字で結合した文字列になります。

実際に使ってみましょう。

>>> ",".join(["a", "b", "c"])
'a,b,c'

今回の場合、区切り文字は,なので、",".join(...)としています。

結果は、各要素を区切り文字で結合した文字列 'a,b,c' となりました。

イテラブルが文字列以外の要素を返す場合

join()メソッドのイテラブルが、文字列以外の要素を返す場合、エラーとなります。

例えば、以下のように文字列と数値が混在するリストをjoin()メソッドに渡してみましょう。

>>> "-".join(["03", 1234, "5678"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected str instance, int found

TypeErrorになりました。エラーメッセージにexpected str instance, int foundとあるように、文字列(str)を期待したところに数値(int)があったためです。

以下のように、リストの要素がすべて文字列であれば、期待通りに動作します。

>>> "-".join(["03", "1234", "5678"])
'03-1234-5678'

まとめ

  • 文字列を区切り文字で結合するには、文字列のjoin()メソッドを使う
  • イテラブル(リストなど)が文字列以外の要素を返すと、エラー(TypeError)になる

参考

関連記事

python-onayami.com

文字列を区切り文字で分割したい: splitメソッド

今回は文字列を区切り文字で分割する方法を紹介します。

split()メソッド

例として、以下のように,で区切られている文字列を考えてみましょう。

a,b,c

文字列を区切り文字で分割するには、文字列のsplit()メソッドを使います。

基本的な使い方は下記の通りです。

文字列.split(区切り文字)

結果は、区切り文字で分割された文字列のリストになります。

なお、「区切り文字」は「デリミタ(delimiter)」とも呼ばれます。

実際に使ってみましょう。

>>> "a,b,c".split(",")
['a', 'b', 'c']

今回の場合、区切り文字は,なので、split(",")としています。

結果は、区切り文字で分割された文字列のリスト['a', 'b', 'c']となりました。

区切り文字を指定しなかった場合

区切り文字を指定しなかった場合、以下のように連続する空白文字がひとつの区切り文字とみなされます。

>>> "a b  c   d".split()
['a', 'b', 'c', 'd']

まとめ

  • 文字列を区切り文字で分割するには、文字列のsplit()メソッドを使う
  • 結果は、区切り文字で分割された文字列のリストになる

参考

パッケージ管理の方法を知りたい(pipの基本的な使い方)

Pythonは標準ライブラリ以外にも、数多くのサードパーティ製のパッケージがあり、PyPI(ぱいぴーあい)というリポジトリにて公開されています。

Pythonサードパーティ製パッケージをインストールするには、pipというツールを使います。

今回はpipの基本的な使い方を解説しましょう。

pipのインストール

pipPythonをインストールすれば同時にインストールされるので、すぐに使えます*1

もしインストールされていない場合は、以下のようにensurepipモジュールを使うことでpipをインストールできます。

python -m ensurepip

なお、Debian/Ubuntuに標準でインストールされているPythonにはensurepipモジュールが存在しません。そのため、代わりにaptコマンドでpython3-pipというパッケージをインストールしてください。

sudo apt install -y python3-pip

pipを使うときの注意点

pipはデフォルトではシステム全体で使える領域にパッケージをインストールしてしまいます。

各プロジェクト毎に必要なパッケージはそれぞれ異なるので、システム全体にインストールするのはお勧めしません。

パッケージをインストールする場合は、基本的に仮想環境を使うのがよいでしょう。

以降は、Pythonの仮想環境が有効になっていることを前提に説明します。

仮想環境について詳しくない方は、こちらの記事をご参照ください。

python-onayami.com

パッケージのインストール

PyPIからパッケージをインストールするには、installコマンドを使います。

pip install <パッケージ名>

指定した「パッケージ名」がPyPIに公開されていれば、そのパッケージがインストールされます。

試しにWebフレームワークであるDjangoをインストールしてみます。

(venv) $ pip install Django
Collecting Django
  Downloading Django-4.1-py3-none-any.whl (8.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 27.8 MB/s eta 0:00:00
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.3/42.3 kB 52.8 MB/s eta 0:00:00
Collecting asgiref<4,>=3.5.2
  Downloading asgiref-3.5.2-py3-none-any.whl (22 kB)
Installing collected packages: sqlparse, asgiref, Django
Successfully installed Django-4.1 asgiref-3.5.2 sqlparse-0.4.2

この記事を執筆した時点で最新のDjango 4.1がインストールされました。また、依存パッケージがあれば合わせてインストールされます。

バージョンを指定してインストール

installコマンドは、デフォルトではそのパッケージの最新版をインストールします。

しかし、バージョンを指定したいこともあるでしょう。その場合は、以下のようにバージョンを指定してインストールできます。

pip install <パッケージ名>==<バージョン>

試しにDjango 4.0をインストールしてみます。

(venv) $ pip install Django==4.0
Collecting Django==4.0
  Using cached Django-4.0-py3-none-any.whl (8.0 MB)
Requirement already satisfied: sqlparse>=0.2.2 in ./venv/lib/python3.10/site-packages (from Django==4.0) (0.4.2)
Requirement already satisfied: asgiref<4,>=3.4.1 in ./venv/lib/python3.10/site-packages (from Django==4.0) (3.5.2)
Installing collected packages: Django
  Attempting uninstall: Django
    Found existing installation: Django 4.1
    Uninstalling Django-4.1:
      Successfully uninstalled Django-4.1
Successfully installed Django-4.0

Djangoのバージョンが4.0にダウングレードされました。

インストールしたパッケージの確認

インストールしたパッケージを確認するには、listコマンドを使います。

pip list

現在インストールされているパッケージを確認してみましょう。

(venv) $ pip list
$ pip list
Package    Version
---------- -------
asgiref    3.5.2
Django     4.0
pip        22.2.2
setuptools 65.0.2
sqlparse   0.4.2

インストールしたパッケージと、それぞれのバージョンが表示されました。

先ほどインストールしたDjango 4.0が確認できます。

なお、asgirefsqlparseDjangoの依存パッケージです。また、pipsetuptoolsはデフォルトでインストールされています。

古いパッケージの確認

開発を続けていると、パッケージ側のバージョンが上がり、プロジェクトで使用しているパッケージが古くなることがあります。

どのパッケージが古くなっているかを確認したい場合は、以下のコマンドを使います(もしくは pip list --outdated)。

pip list -o

実際に使ってみましょう。

(venv) $ pip list -o
Package Version Latest Type
------- ------- ------ -----
Django  4.0     4.1    wheel

先ほどDjangoを4.0にダウングレードしたので、最新版(Latest)であるDjango 4.1の存在が確認できます。

パッケージのアップグレード

インストール済みのパッケージを最新バージョンにするには以下のコマンドです(もしくは pip install --upgrade <パッケージ名>)。

pip install -U <パッケージ名>

ダウングレードしたDjangoを再び最新バージョンにしてみましょう。

(venv) $ pip install -U Django
Requirement already satisfied: Django in ./venv/lib/python3.10/site-packages (4.0)
Collecting Django
  Using cached Django-4.1-py3-none-any.whl (8.1 MB)
Requirement already satisfied: sqlparse>=0.2.2 in ./venv/lib/python3.10/site-packages (from Django) (0.4.2)
Requirement already satisfied: asgiref<4,>=3.5.2 in ./venv/lib/python3.10/site-packages (from Django) (3.5.2)
Installing collected packages: Django
  Attempting uninstall: Django
    Found existing installation: Django 4.0
    Uninstalling Django-4.0:
      Successfully uninstalled Django-4.0
Successfully installed Django-4.1

執筆時点での最新バージョン(4.1)に更新されました。

複数の環境間でパッケージのインストール状態を統一する

以下のコマンドで、現在インストールしているパッケージを、インストール可能なフォーマットで出力できます。

pip freeze

実際に使ってみましょう。

(venv) $ pip freeze
asgiref==3.5.2
Django==4.1
sqlparse==0.4.2

インストール済みのパッケージとバージョンが、インストール可能な形式で一覧表示されました。

これを保存して共有すれば、複数の環境間でパッケージのインストール状態を統一するのに便利です。

保存するファイル名は任意ですが、「requirements.txt」という名前がよく使われます。

(vevn) $ pip freeze > requirements.txt

保存した「requirements.txt」を使って、一括でパッケージをインストールするには以下のようにします。

(vevn) $ pip install -r requirements.txt

パッケージのアンインストール

最後にパッケージをアンインストールする方法です。以下のコマンドでパッケージをアンインストールできます。

pip uninstall <パッケージ名>

Djangoをアンインストールしてみます。途中でアンインストールするか確認されるので、「Y」を入力すればアンインストールできます。

(venv) $ pip uninstall Django
Found existing installation: Django 4.1
Uninstalling Django-4.1:
  Would remove:
    /Users/test/blog/venv/bin/django-admin
    /Users/test/blog/venv/lib/python3.10/site-packages/Django-4.1.dist-info/*
    /Users/test/blog/venv/lib/python3.10/site-packages/django/*
Proceed (Y/n)? Y
  Successfully uninstalled Django-4.1

Djangoがアンインストールされました。

ただし、以下の通りDjangoインストール時に合わせてインストールされた依存パッケージはアンインストールされていないので、注意しましょう。

(venv) $ pip list
Package    Version
---------- -------
asgiref    3.5.2
pip        22.2.2
setuptools 65.0.2
sqlparse   0.4.2

まとめ

pipには他にも機能がありますが、よく使う基本的なコマンドを紹介しました。

最後に今回紹介したコマンドをまとめます。

# パッケージのインストール
pip install <パッケージ名>

# バージョンを指定してパッケージのインストール
pip install <パッケージ名>==<バージョン>

# パッケージのバージョンアップ
pip install -U <パッケージ名>

# パッケージのアンインストール
pip uninstall <パッケージ名>

# インストール済みのパッケージの確認
pip list

# 古いパッケージの確認
pip list -o

# インストール済みのパッケージをrequirements.txtに保存
pip freeze > requirements.txt

# requirements.txtを使ってパッケージをインストール
pip install -r requirements.txt

*1:Python 3.4以降