05-Python

Python(Part.34)| python【タプル(利用編-6)】

python| まとめ | 現役エンジニア&プログラミングスクール講師「python」のまとめページです。pythonに関して抑えておきたい知識や文法やにについて記事をまとめています。まとめページの下部には「おすすめの学習書籍」「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中...

目標

(pythonの)組込み関数「sorted関数」ついて利用方法を理解する。
(pythonの)組込み関数「enumerate関数」ついて利用方法を理解する。
(pythonの)組込み関数「zip関数」ついて利用方法を理解する。

「sorted関数」(組み込み関数)

「sorted関数」の利用方法

sorted関数を利用すると、引数に指定した「イテラブルオブジェクト」の中身を並び替えたリストを生成して返します。このとき、引数に指定した「イテラブルオブジェクト」の並びは影響を受けません。

sorted(iterable/*key=Nonereverse=False)

iterable の要素を並べ替えた新たなリストを返します。

2 つのオプション引数があり、これらはキーワード引数として指定されなければなりません。

key には 1 引数関数を指定します。これは iterable の各要素から比較キーを展開するのに使われます (例えば、 key=str.lower のように指定します)。 デフォルト値は None です (要素を直接比較します)。

reverse は真偽値です。 True がセットされた場合、リストの要素は個々の比較が反転したものとして並び替えられます。

https://docs.python.org/ja/3.11/library/functions.html

「iterable」には「リスト」や「タプル」などのイテラブルオブジェクトを設定します。

※「key」にはソート(並び替え)のための基準を関数などを利用して設定します。デフォルト値は「None」です。

※「reverse」は昇順と降順を指定します。Trueは「降順」、Falseは「昇順」です。デフォルト値は「True」です。

リファレンスの引数に記載されている「/」と「*」は引数の利用方法を分類する記号です。「/」の前にある引数は「位置専用パラメータ」「*」の後ろにある引数は「キーワード専用パラメータ」を指します。

位置専用パラメーターには「値」や「変数」をそのまま入力できます。キーワード専用パラメーターを指定するには、パラメーターの名前を利用し、「パラメータの名前=設定値」とします。今回の場合は「key」や「reverse」に「=」をつけて「key=len」や「reverse=True」とする必要があります。

「sorted関数」の利用(数値の利用)

サンプルプログラム(昇順)

tuple_data = (23, 14, 75, 7, 97)
sorted_list_data = sorted(tuple_data)
print(sorted_list_data)

実行結果

昇順の場合は「reverse」の値がデフォルト値で「False」となるため、設定は不要です。

サンプルプログラム(降順)

tuple_data = (23, 14, 75, 7, 97)
sorted_list_data = sorted(tuple_data, reverse=True)
print(sorted_list_data)

実行結果

「sorted関数」の利用(文字列の利用)

サンプルプログラム(アルファベット順)

tuple_data = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato')
sorted_list_data = sorted(tuple_data)
print(sorted_list_data)

実行結果

サンプルプログラム(keyの指定→文字列の短い順)

tuple_data = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato')
sorted_list_data = sorted(tuple_data, key=len)
print(sorted_list_data)

実行結果

「sorted関数」の引数でキーワード専用パラメータに「key=len」と設定しています。これにより、len関数を利用し、文字の長さを基準とした並び替えが行われることになります。

「enumerate関数」(組み込み関数)

「enumerate関数」はリストなどのイテラブルオブジェクトをfor文を利用して走査するのにとても便利な関数でした。「enumerate関数」を利用することで、要素番号と要素を同時に取り出すことができます。

下図のように繰り返しの1回目では「0,tomato」が2回目では「1,onion」がenumerateオブジェクトとして返されます。(enumerateオブジェクトはタプル型です)

for文では文で準備しふたつの変数を利用して、ブロック内でインデックス番号(開始番号)と要素を利用することができます。(アンパックされた状態)

「enumerate関数」の利用方法

enumerate(iterablestart=0)

enumerate オブジェクトを返します。 iterable は、シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクトでなければなりません。 enumerate() によって返されたイテレータの __next__() メソッドは、 (デフォルトでは 0 となる start からの) カウントと、 iterable 上のイテレーションによって得られた値を含むタプルを返します。

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

次と等価です:

def enumerate(iterable, start=0):
n = start
for elem in iterable:
yield n, elem
n += 1
https://docs.python.org/ja/3.11/library/functions.html#enumerate

「enumerate関数」の利用

サンプルプログラム

tuple_data = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato')

for index_number, value in enumerate(tuple_data):
    print(index_number,'--->',value)

実行結果

「zip関数」(組み込み関数)

「zip 関数」は複数のタプルを利用して、同じインデックスの要素同士をまとめることができる関数です。「zip 関数」を利用して、同じインデックスの要素同士をまとめることを「zip化」といい、「zip化」されたオブジェクトは「zip型」の「zipオブジェクト」となります。

「zip関数」の利用方法

zip(*iterablesstrict=False)

複数のイテラブルを並行に反復処理し、各イテラブルの要素からなるタプルを生成します。

以下はプログラム例です:

>>>

>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')

より正式な定義: zip() は、 i 番目のタプルが 引数に与えた各イテラブルの i 番目の要素を含むような、タプルのイテレータを返します。

zip() に対する別の考え方は、この関数は行を列に、また列を行に変換するということです。これは 行列の転置 とよく似ています。

zip() は遅延評価です: イテラブルが for ループに渡されたり、 list でラップされたりするなどして反復処理されるまで、要素が実際に処理されることはありません。

https://docs.python.org/ja/3/library/functions.html#zip

※「strict」を「True」とすると、要素数の異なるイテラブルオブジェクトが利用された場合に、エラーを表示してくれます。

「zip関数」の利用

サンプルプログラム(要素数が同じ場合)

name = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato')
price = (150, 100, 45, 98, 68)
inventory = (150, 100, 45, 98, 68)

price_inventory_list = tuple(zip(name, price, inventory))
print(price_inventory_list)

実行結果(下の表示は改行されていますが、出力としては1行です。)

サンプルプログラム(要素数が異なる場合)

name = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato', 'carrot')
price = (150, 100, 45, 98, 68)
inventory = (150, 100, 45)

price_inventory_list = tuple(zip(name, price, inventory))
print(price_inventory_list)

実行結果(要素数が異なる場合は、要素数が最小のものと同じ個数だけzip化されます。)

個数が違う場合は、値の抜けがないか注意が必要です。値の抜けが発生した場合、組にしたい要素でズレが起こります。(例えば、priceのふたつ目の値「100」がデータとして欠けた場合、「0」や「null」など別の値を準備せずに利用すると、(‘onion’, 45, 100))となり、その後のzipオブジェクトもずれ込む形となり、意図した組が生成されなくなります。

name = ('tomato', 'onion', 'cucumber', 'eggplant', 'potato', 'carrot')
price = (150, 45, 98, 68)
inventory = (150, 100, 45)

price_inventory_list = tuple(zip(name, price, inventory))
print(price_inventory_list)

実行結果

サンプルプログラム(別の値を設定した場合)

name = ('tomato', 'onion', 'cucumber', 'carrot', 'eggplant', 'potato')
price = (150, 100, 45, 'null', 98, 68)
inventory = (150, 100, 45, 'null', 98, 68)

price_inventory_list = tuple(zip(name, price, inventory))
print(price_inventory_list)

実行結果

サンプルプログラム(「strict」を「True」とした場合)

name = ('tomato', 'onion', 'cucumber', 'carrot', 'eggplant', 'potato')
price = (150, 100, 45, 98, 68)
inventory = (150, 100, 45, 98, 68)

price_inventory_list = tuple(zip(name, price, inventory, strict=True))
print(price_inventory_list)

実行結果

要素数が同じ場合はエラーは起こりません。

今回は以上になります。

「python」おすすめ書籍 ベスト3 | 現役エンジニア&プログラミングスクール講師「python」の学習でお勧めしたい書籍をご紹介しています。お勧めする理由としては、考え方、イメージなどを適切に捉えていること、「生のpython」に焦点をあてて解説をしている書籍であることなどが理由です。勿論、この他にも良い書籍はありますが、特に質の高かったものを選んで記事にしています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST