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

# はじめに

今回は Python における基本的かつ便利なワンライナーを 9 個紹介したいと思います。ワンライナーを使わない例とワンライナーの例の両方を記述していますので、ぜひ参考にしていただければと思います。

## 注意事項

- すべての便利なワンライナーを網羅しているわけではありません。
- ワンライナーを使うことでコードを簡潔に記述することが可能ですが、すべてのケースにおいて適用できるわけではありません。特に長いワンライナーはコードの可読性を下げる可能性もありますので、ご注意ください。

# 変数の入れ替え

ワンライナーを使わない例では、一時変数を使って値を一時的に保存しから、値の入れ替えを行なっています。

```python: ワンライナーを使わない例
a = 1
b = 2
tmp = a
a = b
b = tmp
print(a, b) # 2 1
```

ワンライナーの例では、タプルのアンパックを使って`一時変数を使わずに`簡潔に記述しています。

```python: ワンライナーの例
a = 1
b = 2
a, b = b, a
print(a, b) # 2 1
```

# 複数の変数の同時代入

ワンライナーを使わない例では、各変数に順番に値を代入しています。

```python: ワンライナーを使わない例
a = 1
b = 2
c = 3
```

ワンライナーの例では、`変数名と対応する値を一つの式でまとめて代入`しています。

```python: ワンライナーの例
a, b, c = 1, 2, 3
```

# 三項演算子

ワンライナーを使わない例では、条件式 a % 2 == 0 を使って a の偶奇を判定し、結果を result 変数に値を代入しています。

```python: ワンライナーを使わない例
a = 3
if a % 2 == 0:
    result = "Even"
else:
    result = "Odd"
print(result) # Odd
```

ワンライナーの例では、`判定と代入を1行で行っています`。（`list&dictの内包表記やlambda式`でも使えます）

```python: ワンライナーの例
a = 3
result = "Even" if a % 2 == 0 else "Odd"
print(result) # Odd
```

# list の内包表記

ワンライナーを使わない例では、for ループを使って 0 から 9 までの値をリストに追加しています。

```python: ワンライナーを使わない例
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 までの値を直接リストに追加しています。

```python: ワンライナーの例
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 に追加しています。

```python: ワンライナーを使わない例
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ループとキーと値の対応関係を {} 内に記述`して辞書を作成しています。

```python: ワンライナーの例
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'] という新しいリストが得られます。

```python: ワンライナーを使わない例
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 式は簡潔な関数を作成するのに便利です。特に一時的な関数などの場合に適しています。

```python: ワンライナーの例
words = ["apple", "banana", "orange", "strawberry", "watermelon"]
short_words = list(filter(lambda word: len(word) <= 5, words))
print(short_words)  # ['apple']
```

# アスタリスク(\*)を使ったアンパック

ワンライナーを使わない例では、リスト nums の最初の要素を a に代入し、次の要素を b に代入し、残りの要素をスライスで取得して rest に代入しています。

```python: ワンライナーを使わない例
nums = [1, 2, 3, 4, 5]
a = nums[0] # 1
b = nums[1] # 2
rest = nums[2:] # [3, 4, 5]
```

ワンライナーの例では、リストの要素を一度に複数の変数に代入しています。`最初の2つの要素を a と b にそれぞれ代入し、残りの要素を rest にリストとして代入`しています。
また、`関数に可変長引数を渡す場合も`アスタリスクを使うことができます（`辞書`を展開する場合は`アスタリスクを２つ付ける`）

```python: ワンライナーの例
nums = [1, 2, 3, 4, 5]
a, b, *rest = nums
```

# 文字列の結合

ワンライナーを使わない例では、リスト words の各要素をループで取り出し、結果の文字列 result に対して += 演算子を使って要素を連結しています。最後に rstrip() メソッドを使って末尾の余分なスペースを取り除いています。

```python: ワンライナーを使わない例
words = ["I", "love", "Python"]
result = ""
for word in words:
    result += word + " "
result = result.rstrip()
print(result) # I love Python
```

ワンライナーの例では、`join() メソッド`を使って同じ処理を 1 行で行っています。join() メソッドは、`指定した区切り文字（この例ではスペース）を使ってリストの要素を結合`します。

```python: ワンライナーの例
words = ["I", "love", "Python"]
result = " ".join(words)
print(result) # I love Python
```

# list 内の重複した要素の削除

ワンライナーを使わない例では、リスト nums 内の各要素をループで取り出し、新しいリスト unique_nums にまだ含まれていない要素のみを追加しています。

```python: ワンライナーを使わない例
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()を使うことができます。

```python: ワンライナーの例（元のリストの順序を保持しない）
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）以降です。

```python: ワンライナーの例（元のリストの順序を保持する）
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

- https://docs.python.org/ja/3/reference/simple_stmts.html
- https://docs.python.org/ja/3/reference/expressions.html
- https://docs.python.org/ja/3/tutorial/datastructures.html
- https://docs.python.org/ja/3/library/stdtypes.html#