あなたが本当にPythonプログラミングから理解するようにその質問は、ありませんか?

心が少しかすれた声を鳴らし親族を抑制することができないタイトル書き留め:

距離は、おなじみの曲、来た
それらの声が弱いなかった理由を。
長い時間がない今、あなたのすべてを見ていませんか?
曲があることはありません
沿って優しくあなたを作ると、
私たちの生活の浮き沈みと、
;一緒にテーマソングを歌う
歌があることがない
あなたは突然私の考えさせる、
あなたを幸せにするだけでなく、あなたが、心配になり
そう私が持っている......

トピックに戻る、ミュージカル終了します。最近閲覧LeetCode、非常に興味深い少しタイトルを見つけました。私は実際に収集、マップ機能、ジップ機能、ラムダ関数、ソート機能、デバッグプロセスはまた、イテレータを含み、発電機、リストの内包表記の概念を過ごしたとき、Pythonでお答えしようとします。一見非常に単純な被験者、最終コードは、1つの行にまとめることができるが、ほとんどのPythonプログラミング技法「はニュアンスの精神を参照」と記載、再使用が!このタイトルでは、それはあなたが本当にPythonプログラミングから理解させることがあります。

この質問は、「リスト中のラッキーナンバー」と呼ばれています。それはラッキーナンバーは何ですか?そこに周波数があり、その値は数の大きさと等しい場合の整数のリストでは、我々は、この番号に電話し、「ラッキーナンバー。」例えば、リスト[1、2、2、3]は、図1及び数2の数はそれぞれ1および2は、それらが幸運な数であるが、3がなされてきた、3はラッキーナンバーではありません。

幸運の数字の概念を理解し、我々はそれでラッキーナンバーをリスト[3、5、2、7、3、1、2、4、8、9、3]を見つけようとしなければなりません。このプロセスは、以下のステップに分けることができます。

  1. リストには、重複した番号を識別しません。
  2. 各番号がリストに表示された回数をカウントします
  3. 回数は、これらの数字に等しい数の自分自身を見つけるように見えます

ステップ1、リストには、重複した番号を識別しません。

リストは、と呼ばれる繰り返しエレメントのリスト取り除くために、ある重複した番号を特定しない「行く重いです。」重複排除最も簡単な方法は、コレクションを使用することです。

>>> arr = [3,5,2,7,3,8,1,2,4,8,9,3]
>>> unique = set(arr)
>>> unique
{1, 2, 3, 4, 5, 7, 8, 9}

ステップ番号2は、各番号の統計情報が一覧に表示されます

私たちは、次のようにオブジェクトのリストが使用されている要素の数がリストに表示されることができ、カウント()メソッドの戻りが来ることを知っています:

>>> arr = [3,5,2,7,3,8,1,2,4,8,9,3]
>>> arr.count(8) # 元素8在数组arr中出现过2次
2

次に、我々は、それぞれ表示され、さらに作業が必要とされる適切なデータ構造、として保存の数をカウントすることにより、1重複除外、1の各要素を横断するだけで済みます。

>>> arr = [3,5,2,7,3,8,1,2,4,8,9,3]
>>> unique = set(arr) # 去除重复元素
>>> pairs = list() # 空列表,用于保存数组元素和出现次数组成的元组
>>> for i in unique:
		pairs.append((i, arr.count(i)))
	
>>> pairs
[(1, 1), (2, 2), (3, 3), (4, 1), (5, 1), (7, 1), (8, 2), (9, 1)]

初心者として、このコードが書かれている、それは非常に良いされています。しかし、決して自己満足プログラマ、停滞の追求があります。リサイクルのために拒否していない場合は、リストの内包表記に隠されたとして、彼らは、サイクルにできるだけ多くのような非表示になります。行うには自分の好きなことは、このようなループのために交換するために、フィルタ機能をマッピング機能を使用して、forループを破壊することが可能にすべてをやろうです。それはこの方法)すべての要素コール(のリストを数えることであるので、ここでは、マップ機能を循環させるための最も適切な代替物です。

>>> m = map(arr.count, unique)
>>> m
<map object at 0x0000020A2D090E08>
>>> list(m) # 生成器可以转成列表
[1, 2, 3, 1, 1, 1, 2, 1]
>>> list(m) # 生成器只能用一次,用过之后,就自动清理了
[]

マップ機能は、ジェネレータ(発電機)を返し、リストと同じを通過することができますが、我々はリストを(使用しない限りとして、視覚的に、リストのような様々な要素が表示されない)リストに発電機を回すために(あなたが実際には必要ありません。リストに発電機)。終わりを通過、それは自動的に消え、いったん別の発電機とイテレータ、またはBuilderは、イテレータの特別な種類であるが、唯一の横断できることに注意してください。イテレータを繰り返し横断することができます。例えば、範囲()関数が返すイテレータ。

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
>>> list(a)
[0, 1, 2, 3, 4]

ジェネレータとイテレータを持って、我々は、元のトピックに戻ることがあります。使用マップのマッピング関数は、我々は、各要素の出現回数を取得し、また、タプルからなる対応する要素を必要とします。今回、彼らはのジッパー()関数を使用していました。ファスナー()関数は、重合のた​​めのビルダーを作成するために、各反復オブジェクト要素の(イテレータ、発電機、リスト、タプル、集合、文字列など)、同じ添字で重合要素は、異なる長さよりも大きいが無視されてもよいです反復オブジェクト要素最短長。

>>> m = map(arr.count, unique)
>>> z = zip(unique, m)
>>> z
<zip object at 0x0000020A2D490508>
>>> list(z)
[(1, 1), (2, 2), (3, 3), (4, 1), (5, 1), (7, 1), (8, 2), (9, 1)]
>>> list(z)
[]

明らかに、ジップ()関数が返すも、発電機は一度だけ使用することができ、その後なくなっています。

ステップ3は、回数自体が見つけるために表示される番号に等しいです

各要素の出現、その数によって、私達はちょうど私たちがサイクルにそれを持っていない理由......いいえ、待ち時間、をループする必要がありますか?私たちはただ、再び各要素フィルタを取る自身がそれらのタプルの出現数に等しいそれらの要素を識別し、なぜフィルタ機能フィルタを(しようとしない)のですか?

>>> def func(x): # 参数x是元组类型
		if x[0] == x[1]:
			return x
	
>>> m = map(arr.count, unique)
>>> z = zip(unique, m)
>>> f = filter(func, z)
>>> f
<filter object at 0x0000020A2D1DD908>
>>> list(f)
[(1, 1), (2, 2), (3, 3)]
>>> list(f)
[]

フィルタ関数は、フィルタ()最初のパラメータがフィルタに一致する要素は、2番目のパラメータは反復的であってもよく、オブジェクトをフィルタリングする必要があるかどうかを決定するための関数であり、2つのパラメータを受け付けます。フィルタ()関数は、発電機のリターンのみ消失した後、即ち、一度使用することができます。

ここに書く、我々はほぼ完了します。しかし、プログラマの追求として、あなたがFUNCに耐えることができます()は、奇妙なA機能に見えますか?答えはノーです!あなたは、ラムダ関数と交換します。また、我々はまた、要素の大きさに応じて結果をソートする必要があるかもしれません。次のようにプラスソート、完全なコードは次のようになります。

>>> arr = [3,5,2,7,3,8,1,2,4,8,9,3]
>>> unique = set(arr)
>>> m = map(arr.count, unique)
>>> z = zip(unique, m)
>>> f = filter(lambda x:x[0]==x[1], z)
>>> s = sorted(f, key=lambda x:x[0])
>>> print('幸运数是:', [item[0] for item in s])
幸运数是: [1, 2, 3]

究極のコードでは、行が取得します

あなたはその行を書いてきた場合、複雑な機能を実装することができました、苦い経験の被害などの象形文字のようなコードのルックスは、それから、今、あなたは他の誰かの惨禍に、一つのラインに上記のコードを置くことができます。

>>> arr = [3,5,2,7,3,8,1,2,4,8,9,3]
>>> print('幸运数是:', [item[0] for item in sorted(filter(lambda x:x[0]==x[1], zip(set(arr), map(arr.count, set(arr)))), key=lambda x:x[0])])
幸运数是: [1, 2, 3]
公開された101元の記事 ウォンの賞賛10000 + ビュー156万+

おすすめ

転載: blog.csdn.net/xufive/article/details/105215593