Pythonのzip()関数の探索:反復とデータの組み合わせの簡略化
Pythonのzip()関数の探索
Pythonにおけるzip()を使用したデータ操作と繰り返しの効率と生産性を向上させるための初心者向けガイド
はじめに
zipは、標準のPythonインタプリタに組み込まれた関数です。これは強力なメソッドであり、辞書やリストなどのイテラブルとの作業を容易にします。
この記事では、zip関数の構文と動作について詳しく説明し、実際の状況でこのメソッドをどのように利用するかを実践的に理解します。
構文
Pythonのドキュメントに基づく一般的な関数定義は次のとおりです:
zip(*iterables, strict=False)
この定義から明らかなように、メソッドは*iterables非キーワード引数を使用して任意の数のイテラブルを受け取ります。そのため、zip関数に任意の数のイテラブルを渡すことができます。これらは単一の引数リストとして渡されます。
後で説明する「strict」キーワード引数もあります。
ユースケース例1
zip関数を使用する方法を理解するために、この対話型コードスニペットを確認してください。
例1 — Replit
3つの異なるリストがあるとします。1つは製品を、他の2つのリストは製品の販売数量と価格を含んでいます。
製品ごとの総売上を計算したい場合、単純なforループを使用してそれを行うことができます。ただし、各配列にインデックスを付ける必要があり、サイズの不一致の場合にはエッジケースに対処する必要があります。さらに、この解決策は任意の数のイテラブルに対してスケーラブルではありません。
zip関数は、このようなタスクを実行するための簡単なインターフェースを提供します。すべてのイテラブルをzip関数に渡すことができます。
これにより、タプルのイテレータが返されます。i番目のタプルには、引数イテラブルのi番目の要素が含まれます。
したがって、上記の例でzippedリストを反復処理するために、各製品は価格と数量とともに1つのタプル内に結合されます。これは反復処理中に値を取得するために分解することができます。
zip関数の動作をよりよく理解するために、上記のコードを実行してください。
ユースケース例2
これはより難しい例です。2次元配列があるとし、列のすべての値の平均を求めたいとします。
forループを使用して行を反復処理することで、行列の行を反復処理することができます。列の平均を求めるためには、列ごとにネストされたループを使用して列を個別に反復処理する必要があります。
zipは、この問題に対する回避策を提供します。
transposed = zip(*matrix)
行列を単にzip関数にイテラブルとして渡すことで、行列を転置することができます。*演算子は引数を展開するために使用されるため、行列を展開して転置します。
column_averages = [sum(column) / len(column) for column in transposed]
それから、zippedイテラブルから各列を反復処理して列の平均を求めることができます。
イテラブルのアンズイップ方法
zip関数と*演算子の両方の理解ができたので、両方を組み合わせてzip関数を逆にすることができます。
いくつかのイテラブルを一緒にzipした後、すべてのzipされたタプルを展開して再びzipすることによってそれらを回復することができます。
ステップバイステップで説明します:
products = ['Apple', 'Banana', 'Cherry']prices = [1.5, 0.75, 2.25]quantities = [10, 15, 5]# zip()を使用してリストを結合するsales = zip(products, prices, quantities)
まず、イテラブルを展開し、これにより転置行列の例と同様のイテラブルが作成されます。
print(*sales)# 出力# ('Apple', 1.5, 10) ('Banana', 0.75, 15) ('Cherry', 2.25, 5)
それらを一緒にzipすることができます。つまり、最初の位置のすべての要素は最初のイテラブルのメンバーであり、2番目の位置のすべての要素は2番目のイテラブルのメンバーであり、それ以降も同様です。
注意すべき重要な点は、zipオブジェクトを繰り返し処理すると、使い果たされ、zipオブジェクトが空になるということです。
したがって、これを一行で短縮して行います:
products, prices, quantities = zip(*sales)
厳密なキーワード引数
デフォルトでは、zip関数は異なるサイズのイテラブルを許可します。渡されるイテラブルが異なるサイズの場合、最も短いイテラブルまでの要素のみがzipされます。
list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))# 出力 [(0, 'fee'), (1, 'fi'), (2, 'fo')]
ただし、ほとんどの場合、zip関数は同じサイズのイテラブルに使用されます。この制限を確実にするために、strict=Trueを渡すことができます。これにより、イテラブル引数間のサイズの一致がある場合にValueErrorが発生します。
Zipの利点
メモリ効率
Zipは遅延評価です。イテレーション中にイテラブルがオンザフライで生成されます。したがって、zippedされたイテラブルを保存するために新しいリストは必要ありません。
柔軟性
Zipは、リスト、辞書、タプル、文字列など、さまざまなイテラブルと連携します。さらに、ユーザー定義のクラスでも動作します。Pythonで__iter__ダンダーメソッドを実装するだけです。コードの例でこれを示します。
class Person: def __init__(self, name, age): self.name = name self.age = age def __iter__(self): return iter([self.name, self.age])# Personクラスのインスタンスを作成person1 = Person("John", 30)person2 = Person("Alice", 25)person3 = Person("Bob", 35)# Personオブジェクトをzipzipped = zip(person1, person2, person3)# zipオブジェクトを繰り返し処理して要素を表示for item in zipped: print(item)
結論
zip関数は、簡略化されたコード構造で同時のイテレーションを可能にする多目的な関数です。それはmap、filter、reduce関数と組み合わせて、わずかなコードで複雑なデータ操作を実現するために使用することができます。
この記事が気に入ったら、Pythonと機械学習のドメインに関するさらなる記事のために私をフォローしてください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles