Pythonイテレーターもこのようにプレイできます

過去数日間、私は基本的に自宅、Vientiane Hui、Green Park、Xiaodian Lake、そして弟の結婚式の宴会で遊んでいました。暇なときは、オタクの時間を見て、ゲームをしたり、WeChatをスワイプしたりできます。それだけです。さらに、毎週金曜日、金曜日走行距離はまだ続いています。

最近、イテレーターのクーデターを発見しました。学ぶのが大好きなあなたと共有せずにはいられません。

反復可能オブジェクト、反復子、およびジェネレーターの定義と理解については、前の記事[Python Basicシリーズ-反復可能オブジェクト、反復子、およびジェネレーター](https://mp.weixin.qq.com/s?__biz=MzU0OTg3NzU2NA==&mid=2247483827&idx=1&sn=6a661c78b3f0db2e4c94cee1ddc3b036&scene=21#wechat_redirect)を参照してください。

つまり、それらの関係は次の図で表すことができます。

Zhihuでそのような写真を見ると、より鮮明になります。

アルゴリズムの問題をやってみましょう:

文字列sとtが与えられた場合、sがtのサブシーケンスであるかどうかを判別します。
sとtには英語の小文字しか含まれていないと考えることができます。文字列tは非常に長く(長さ〜= 500,000)、sは短い文字列(長さ<= 100)です。
文字列のサブシーケンスは、残りの文字の相対位置を変更せずに、元の文字列から一部の文字を削除する(または削除しない)ことによって形成される新しい文字列です。 (たとえば、「ace」は「abcde」のサブシーケンスですが、「aec」はそうではありません)。
ソース:LeetCode
リンク:https://leetcode-cn.com/problems/is-subsequence

この問題を解決するために、従来のアルゴリズムは貪欲なアルゴリズムです.2つのポインターPsとPtは、それぞれ2つの文字列sとtの先頭を指すように維持され、文字列tが最後までスキャンされます。文字がPsと同じ場合、 Psポインタを1ステップ進めます。Psが文字列sの最後の文字から移動すると、Trueを返します。それ以外の場合はFalseを返します。

ただし、このコードを書き留めるには約10行かかります。

イテレーターとジェネレーターを使用する場合、2つの行が実行されます。

>>> def is_subseq(s,t):...     t =iter(t)...returnall(i in t for i in s)...>>>is_subseq('ace','abcde')
True
>>> is_subseq('aec','abcde')
False
>>>

コードの背後にあるロジックが一目でわかる場合は、すでに上級Pythonエンジニアであることを意味します。混乱している場合は、コードを拡張して段階的に見ていきます。

まず、元の文字列をイテレーターに変換します。

>>> t ='abcde'>>>iter(t)<str_iterator object at 0x7fa7f22c8a60>>>> t =iter(t)>>> t
< str_iterator object at 0x7fa7f229d4c0>

次に、サブストリングを反復処理し、各文字が上記の反復子tにあるかどうかを順番に判別します。

( i in t for i in s)

一般的な考え方:文字列aecのすべての文字が元の文字列abcdeに存在するため、iはtに含まれている必要があります。

良い点は、このin操作では、in操作は文字がイテレーターにあるかどうかを判別し、トラバースする必要があります。トラバーサルは、イテレーターの __next__メソッドを呼び出し、存在する場合はTrueを返します。次の判断では、開始位置に戻らずに __next__を続行して、再度検索します。この時点で、実験として次のステップを段階的に実行できます。例としてs = 'aec'およびt = 'abcdef'を取り上げます。

>>> t ='abcdef'>>> s ='aec'>>> t =iter(t)>>>'a'in t
True
>>> next(t)'b'>>>'e'in t
True
>>> # この時点で、ポインタはeを指しており、次に呼び出してfを返します。
>>> next(t)'f'>>>'c'in t #ポインタはすでにfを指しており、文字cはfの後に表示されず、falseを返す必要があります
False

これを見て、in操作がTrueを返した後、次回inが判断されると、前回終了した位置から検索されること、つまり、ループ内で要素が反復中であるかどうかを判断することをすでに理解していると思います。デバイスでは、イテレーターは最後の判断後の位置を自動的に記憶します。これは非表示のポインターに相当し、この問題を解決するのに非常に便利です。

最後のall関数は、イテレーターのすべての要素がTrueであるかどうかを判別するために使用されます。Trueの場合はTrueを返し、そうでない場合はFalseを返します。

Pythonはとても魔法のようでエレガントです。ただし、面接官はジェネレーターの使い方を知らない可能性があるため、面接中はこの手法を使用しないように注意する必要があります。この技術的知識に関しては、実際の作業の適用については、すでに多くの人よりも熟練しています。アップ。

Pythonの7番、より満足のいく7番を実行し、毎週Pythonのトリックを学び、注意を払うことを歓迎します。

(終了)

Recommended Posts

Pythonイテレーターもこのようにプレイできます
Pythonは公式アカウントも分析できます
変数タイプをpythonで宣言できますか
pythonコードをソフトウェアにすることはできますか
python辞書の値を変更できますか?