LoginSignup
21
26
お題は不問!Qiita Engineer Festa 2023で記事投稿!

[Python]便利なワンライナー9選

Last updated at Posted at 2023-07-17

はじめに

今回は 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]

参考 URL

21
26
0

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
21
26