はじめに
今回は Python における基本的かつ便利なワンライナーを 9 個紹介したいと思います。ワンライナーを使わない例とワンライナーの例の両方を記述していますので、ぜひ参考にしていただければと思います。
注意事項
- すべての便利なワンライナーを網羅しているわけではありません。
- ワンライナーを使うことでコードを簡潔に記述することが可能ですが、すべてのケースにおいて適用できるわけではありません。特に長いワンライナーはコードの可読性を下げる可能性もありますので、ご注意ください。
変数の入れ替え
ワンライナーを使わない例では、一時変数を使って値を一時的に保存しから、値の入れ替えを行なっています。
a = 1
b = 2
tmp = a
a = b
b = tmp
print(a, b) # 2 1
ワンライナーの例では、タプルのアンパックを使って一時変数を使わずに
簡潔に記述しています。
a = 1
b = 2
a, b = b, a
print(a, b) # 2 1
複数の変数の同時代入
ワンライナーを使わない例では、各変数に順番に値を代入しています。
a = 1
b = 2
c = 3
ワンライナーの例では、変数名と対応する値を一つの式でまとめて代入
しています。
a, b, c = 1, 2, 3
三項演算子
ワンライナーを使わない例では、条件式 a % 2 == 0 を使って a の偶奇を判定し、結果を result 変数に値を代入しています。
a = 3
if a % 2 == 0:
result = "Even"
else:
result = "Odd"
print(result) # Odd
ワンライナーの例では、判定と代入を1行で行っています
。(list&dictの内包表記やlambda式
でも使えます)
a = 3
result = "Even" if a % 2 == 0 else "Odd"
print(result) # Odd
list の内包表記
ワンライナーを使わない例では、for ループを使って 0 から 9 までの値をリストに追加しています。
nums = []
for i in range(10):
nums.append(i)
print(nums) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ワンライナーの例では、内包表記を使って同じ処理を 1 行で行っています。nums = [i for i in range(10)] のように、for ループと条件を [] 内に記述する
ことで、0 から 9 までの値を直接リストに追加しています。
nums = [i for i in range(10)]
print(nums) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
dict の内包表記
ワンライナーを使わない例では、for ループを使ってリスト nums 内の各要素に対してループを回し、その値をキーとして、その値の 2 乗を値として辞書 squared_dict に追加しています。
nums = [1, 2, 3, 4, 5]
squared_dict = {}
for i in nums:
squared_dict[i] = i**2
print(squared_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
ワンライナーの例では、内包表記を使って同じ処理を 1 行で行っています。forループとキーと値の対応関係を {} 内に記述
して辞書を作成しています。
nums = [1, 2, 3, 4, 5]
squared_dict = {i: i**2 for i in nums}
print(squared_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
lambda 式
ワンライナーを使わない例では、filter_short_words という関数を定義し、引数 word の長さが 5 以下の場合にその要素を返すようにしています。filter() 関数では、filter_short_words 関数をフィルタリング条件として指定し、words リストの要素をフィルタリングしています。結果として、['apple'] という新しいリストが得られます。
def filter_short_words(word):
if len(word) <= 5:
return word
words = ["apple", "banana", "orange", "strawberry", "watermelon"]
short_words = list(filter(filter_short_words, words))
print(short_words) # ['apple']
ワンライナーの例では、lambda 式を使ってフィルタリング条件を直接指定しています。lambda 式は簡潔な関数を作成するのに便利です。特に一時的な関数などの場合に適しています。
words = ["apple", "banana", "orange", "strawberry", "watermelon"]
short_words = list(filter(lambda word: len(word) <= 5, words))
print(short_words) # ['apple']
アスタリスク(*)を使ったアンパック
ワンライナーを使わない例では、リスト nums の最初の要素を a に代入し、次の要素を b に代入し、残りの要素をスライスで取得して rest に代入しています。
nums = [1, 2, 3, 4, 5]
a = nums[0] # 1
b = nums[1] # 2
rest = nums[2:] # [3, 4, 5]
ワンライナーの例では、リストの要素を一度に複数の変数に代入しています。最初の2つの要素を a と b にそれぞれ代入し、残りの要素を rest にリストとして代入
しています。
また、関数に可変長引数を渡す場合も
アスタリスクを使うことができます(辞書
を展開する場合はアスタリスクを2つ付ける
)
nums = [1, 2, 3, 4, 5]
a, b, *rest = nums
文字列の結合
ワンライナーを使わない例では、リスト words の各要素をループで取り出し、結果の文字列 result に対して += 演算子を使って要素を連結しています。最後に rstrip() メソッドを使って末尾の余分なスペースを取り除いています。
words = ["I", "love", "Python"]
result = ""
for word in words:
result += word + " "
result = result.rstrip()
print(result) # I love Python
ワンライナーの例では、join() メソッド
を使って同じ処理を 1 行で行っています。join() メソッドは、指定した区切り文字(この例ではスペース)を使ってリストの要素を結合
します。
words = ["I", "love", "Python"]
result = " ".join(words)
print(result) # I love Python
list 内の重複した要素の削除
ワンライナーを使わない例では、リスト nums 内の各要素をループで取り出し、新しいリスト unique_nums にまだ含まれていない要素のみを追加しています。
nums = [2, 1, 3, 3, 4, 4, 5, 5, 5]
unique_nums = []
for num in nums:
if num not in unique_nums:
unique_nums.append(num)
print(unique_nums) # [2, 1, 3, 4, 5]
ワンライナーの例では、リストを集合に変換し、重複した要素を排除してから、再びリストに変換しています。集合は重複を許さないデータ構造であるため、リストを集合に変換することで重複した要素を自動的に排除
することができます。
ただし、集合は要素の順序を保持しない
ので、元のリストの順序を保持しながら重複を削除したい場合は、dict.fromkeys()を使うことができます。
nums = [2, 1, 3, 3, 4, 4, 5, 5, 5]
unique_nums = list(set(nums))
print(unique_nums) # [1, 2, 3, 4, 5]
dict.fromkeys()は、指定されたキーのリストやイテラブルを使って辞書を作成しますが、重複したキーは自動的に削除されます。その後、list() 関数を使って辞書のキーをリストに変換すれば、元のリストの順序を保ちつつ重複を削除することができます。
※dict.fromkeys()における引数のシーケンスの順序が保持されることが保証されているのは、Python 3.7(CPython 3.6)以降です。
nums = [2, 1, 3, 3, 4, 4, 5, 5, 5]
unique_nums = list(dict.fromkeys(nums))
print(unique_nums) # [2, 1, 3, 4, 5]