Tips

Pythonのリストや辞書になっている2つのデータを合体させる方法【extend, fromkeys, sorted,sort,random,sample,shuffle,dict,zip,update】

  • このエントリーをはてなブックマークに追加

「リストのソートでsortとsortedのメソッドの違いを知らない」
「辞書のキーと値を丸っと入れかえる方法を知りたい」
「JavaScriptのスプレッド構文のようにデータを合体して更新させたい」

本日はそんな方に向けてリストや辞書のデータを合体させたり更新する方法を紹介していきます。

Pythonにおいてデータの操作や処理は非常に柔軟であり、さまざまな方法で実行することができます。特にリストや辞書といったデータ構造を組み合わせることで、情報を効果的に組み立てたり整理したりすることが可能です。

この記事では、「extend」、「fromkeys」、「sorted」、「sort」、「random」、「sample」、「shuffle」、「dict」、「zip」、「update」といったPythonの便利な機能を駆使して、2つの異なるデータを結合する方法を詳しく解説します。

さまざまな場面で役立つテクニックを紹介することで、Pythonをより効率的に活用するためのヒントを提供します。

また動画もありますので必要に応じて活用してください。

Pythonで2つのリストを合体、分割、重複削除させる方法

それではまず最初はリスト同士の結合からですが、実は数字の計算と同じで足し算を使うことができます。

list1 = [1,2,3]
list2 = [4,5,6]
list3 = list1 + list2
print(list1, list2, list3) # [1, 2, 3] [4, 5, 6] [1, 2, 3, 4, 5, 6]と表示される

こちらの方法では元のlist1,list2とは別の新しいリストlist3を作る形で結合をしています。

一方で新しいリストを作るのではなくlist1を更新する形で結合するにはextendというメソッドを使用します。

list4 = [1,2,3]
list5 = [4,5,6]
list4.extend(list5)
print(list4, list5) # [1, 2, 3, 4, 5, 6] [4, 5, 6]と表示される

続いて分割する方法についてです。

リストの中身の要素をn個の小さなリストに分割する場合は以下のように関数を作っていきます。

関数slit_listでは2個=2番目の要素ごとで切っていくことをやっています。

list6 = ["a","b","c","d","e"]

def split_list(list, n):
  for index in range(0, len(list), n):
    yield list[index: index + n]

result = list(split_list(list6, 2))
print(result) # [['a', 'b'], ['c', 'd'], ['e']]と表示される

もともとlist6には5つの要素があったので、2個と2個と1個の3分割した形になります。

続いてリストの中の要素で重複した値があったときに重複削除する方法になります。

list7 = [1,2,3,4,5,5,6,6]
print(dict.fromkeys(list7))
print(list(dict.fromkeys(list7))) # [1, 2, 3, 4, 5, 6]と表示される

まず最初にdictメソッドでリストを辞書に変換しました。

辞書に変換することでfromkeysメソッドという「重複削除した要素をキーとして辞書を構築する」ことをやってくれるメソッドが使えるようになるためです。

fromkeysメソッドを実行した後に再度listメソッドを使ってリストに戻すことで実現できています。

Pythonで辞書を合体、重複削除、キーと値の入れ替えをする方法

続いて辞書データの操作になります。

辞書同士の合体にはリストでやった四則演算の足し算は使えなくて、updateメソッドというものを使用します。

updateメソッドは元にあった辞書を更新する形で2つの辞書を合体させます。

dict3 = {"0001": "yamada", "0002": "tanaka"}
dict4 = {"0003": "kimura", "0004": "suzuki"}
dict3.update(dict4)
print(dict3)
# {'0001': 'yamada', '0002': 'tanaka', '0003': 'kimura', '0004': 'suzuki'}と表示される

ちなみに2つの辞書についてキーの重複があった場合は、updateメソッドの引数に入れた辞書が優先されて重複削除した上で合体します。

dict3 = {"0001": "yamada", "0002": "tanaka"}
# ここを変更
dict4 = {"0001": "kimura", "0002": "suzuki"}
dict3.update(dict4)
print(dict3)
# {'0001': 'kimura', '0002': 'suzuki'}と表示される

この習性を活かして重複削除の用途として使うこともできますので覚えておきましょう。

# 重複削除に利用できる
dict5 = {"0001": "yamada", "0002": "tanaka"}
dict6 = {"0001": "yamada", "0003": "kimura", "0004": "suzuki"}
dict5.update(dict6)
print(dict5)
# {'0001': 'yamada', '0002': 'tanaka', '0003': 'kimura', '0004': 'suzuki'}と表示される

またリストとリストを合体させて辞書を作り出すこともできます。

データ型を辞書に変更するにはdictメソッドを使用して引数にzipメソッドを実行した2つのリストを入れます。

そうすると片方のリストの値がキーになり、もう片方のリストの値がキーに対応する値として利用されます。

list1 = [1,2,3,4,5]
list2 = ["a","b","c","d","e"]
dict1 = dict(zip(list1,list2))
print(dict1)
# {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}と表示される

また作った辞書についてキーと値を入れ替えたい時は以下のように、item要素で中身を取り出してキーと値の位置を反転させることをループすれば可能です。

dict2 = {value: key for key, value in dict1.items()}
print(dict2)
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}と表示される

Pythonでリストの中身をソートする方法

続いてリストの中身をソートする方法になります。

まずは昇順でソートする方法は以下のようにsortedメソッドを使用します。

list1 = [5,3,2,1,6,4]
print(list1, sorted(list1))
# [5, 3, 2, 1, 6, 4] [1, 2, 3, 4, 5, 6]

list2 = ["c","b","a","d","e"]
print(list2, sorted(list2))
# ['c', 'b', 'a', 'd', 'e'] ['a', 'b', 'c', 'd', 'e']と表示される

sortedメソッドは元のリストは更新せずに新しいリストとしてソートするメソッドです。

また降順でソートするにはsortedメソッドの第二引数でreverse=Trueを指定します。

list1 = [5,3,2,1,6,4]
print(list1, sorted(list1, reverse=True))
# [5, 3, 2, 1, 6, 4] [6, 5, 4, 3, 2, 1]

list2 = ["c","b","a","d","e"]
print(list2, sorted(list2, reverse=True))
# ['c', 'b', 'a', 'd', 'e'] ['e', 'd', 'c', 'b', 'a']と表示される

リストの中身が文字列の英語では注意が必要でPythonでは大文字と小文字は別物として扱われるためsortedメソッドを以下のような大文字と小文字が混ざったリストに実行すると上手くいきません。

list3 = ["c","B","a","D","e"]
print(list3, sorted(list3))
# ['c', 'B', 'a', 'D', 'e'] ['B', 'D', 'a', 'c', 'e']と表示される

そこで大文字と小文字を分けずにソートするにはsortedメソッドの第二引数にkey=str.lowerを指定します。

list3 = ["c","B","a","D","e"]
print(list3, sorted(list3, key=str.lower))
# ['c', 'B', 'a', 'D', 'e'] ['a', 'B', 'c', 'D', 'e']と表示される

ちなみに似たようなメソッドでsortメソッドというものがあります。

sortメソッドはsortedメソッドと違って元のリストを更新しながらソートします。

名前が似ていますので違いがわかるように練習しておきましょう。

#昇順

list1 = [5,3,2,1,6,4]
list1.sort()
print(list1)
# [1, 2, 3, 4, 5, 6]と表示される

list2 = ["c","b","a","d","e"]
list2.sort()
print(list2)
# ['a', 'b', 'c', 'd', 'e']と表示される
#降順

list1 = [5,3,2,1,6,4]
list1.sort(reverse=True)
print(list1)
# [[6, 5, 4, 3, 2, 1]と表示される

list2 = ["c","b","a","d","e"]
list2.sort(reverse=True)
print(list2)
# ['e', 'd', 'c', 'b', 'a']と表示される

sortメソッドもsortedメソッドと同様に英語の大文字と小文字が混ざるケースでは第二引数にkey=str.lowerを指定します。

list3 = ["c","B","a","D","e"]
list3.sort(key=str.lower)
print(list3)
# ['a', 'B', 'c', 'D', 'e']と表示される

Pythonでリストの中身をシャッフルする方法

続いてrandomモジュールを使ったリストのシャッフルを紹介します。

randomモジュールにあるsampleというメソッドを使うと元のリストとは別にして新しくシャッフルされたリストを作成します。

第一引数にシャッフルしたいリスト、第二引数にリストの長さを指定します。

import random
list4 = [1,2,3,4,5]
print(list4, random.sample(list4, len(list4)))
# [1, 2, 3, 4, 5] [5, 3, 1, 2, 4]と表示される

元のリストを更新した上でシャッフルするにはsampleとは別にshuffleというメソッドが用意されています。

import random
list5 = [1,2,3,4,5]
print(list5, random.shuffle(list5))
# [4, 5, 3, 2, 1] Noneと表示される

リストの操作は特に元のリストの中身を保持したいのか更新してしまって良いのかを判断することを特に注意しましょう。

こちらの本を参考にして作成しました。
良ければこちらからどうぞ。

  • このエントリーをはてなブックマークに追加