Pythonアルゴリズムの一般的なテクニックと組み込みライブラリ

Pythonアルゴリズムの一般的なテクニックと組み込みライブラリ

[[347377]]

Pythonアルゴリズムの一般的なテクニックと組み込みライブラリ

近年、Python の人気が高まるにつれ、徐々に多くのプログラマーに好まれるようになりました。多くのプログラマーは、問題を練習するための最初の言語として Python を使い始めています。

最近、Python を使用して問題を解決していたときに、Python でよく使用されるライブラリ API と問題解決手法を見つけたいと思いました。これは C++ の STL ライブラリのドキュメントに似ていますが、残念ながら見つけられなかったので、質問に答えたりインターネットを検索したりした自分の経験を組み合わせて、自分とみんなが読めるドキュメントを作成することにしました。

1. 入力と出力:

1.1 最初の行には、スペースで区切られた 2 つの値 n と m が与えられます。最初の n は、次に n 行の入力があることを決定し、m は各行にいくつの数字があるかを決定します。m 個の数字はスペースで区切られます。

解決策: Python の入力関数が受け取る入力はデフォルトで文字列なので、文字列のカット、強制型変換、リスト ジェネレーターを使用することで入力の問題を完全に解決できます。コードは次のとおりです。

  1. # 2つの値を受け取り、nとmを使用してそれぞれリスト内の2つの値を受け取ります 
  2. n, m = [int(x) の場合、input().split() 内の x]  
  3. # 入力リストのリストを構築する 
  4. num_list = []  
  5. iが範囲(n)内にある場合:  
  6. # Pythonはmの値を気にする必要はなく、すべての値を受け取り、lenを使用して長さを決定します。  
  7. tmp_list = [int(x) は input().split() 内の x を表します]  
  8. num_list.append(tmp_list)

同様に、カンマ (,) を使用して区切る場合は、同じ値を split 関数に渡すだけです。

1.2 数字の行を出力する

Python の print 関数はデフォルトで改行を終端文字として使用するため、必要な間隔に変更する必要があります。コードは次のとおりです。

  1. iが範囲(10)内にある場合:  
  2. print(i,終了= ' ' )

end は print 関数のパラメータで、出力の終了文字を決定します。ここで、これをスペースに変更すると、スペースで区切られた数字の行が出力されることになります。他の文字は自由に変更できます。

2. 空リストの生成、文字列の変更、リストの走査

2.1コードを書くときに、長さと初期値を持つ空のリストが必要になることがあります。生成方法は次のとおりです。

  1. # 1. 乗算を使用して、初期値がFalseの長さ100の1次元リストを生成します。  
  2. 訪問= [False] * 100  
  3. # 2. リストジェネレータを使用して、初期値が0のn*mの2次元リストを生成します。  
  4. 訪問= [[i が範囲(m)内、j が範囲(n)] 内の 0]

2.2 Python では、文字列をその場で変更することはできません。変更ごとに新しい文字列を生成すると、変更の数が多く、文字列が非常に大きい場合にオーバーヘッドが非常に高くなります。したがって、一般的には文字列はリストに変換され、変更されてから元に戻されます。

  1. 文字列= '私は鶏肉を食べるのが大好きです'    
  2. # 文字列をリストに変換する 
  3. string_list = リスト(文字列)  
  4. # .......文字列リストを変更する 
  5. # コード 
  6. # 文字列のリストを文字列に再構築する 
  7. #文字列= '' .join(string_list)

2.3 Python でリストをトラバースする方法は数多くあります。最も直接的な方法は、リストを直接反復することです。ただし、インデックスに基づいて配列を操作し、配列の値を変更する必要があることが多いため、次のコードの 2 番目と 3 番目の方法をお勧めします。

  1. num_list = [i が範囲内(10)]  
  2. # 1. リストを直接反復する 
  3. num_list内の項目の場合:  
  4. # コード 
  5. 合格 
  6. # 2. インデックスによる反復 
  7. i が範囲(len(num_list))内にある場合:  
  8. print(num_list[i])  
  9. # 3. enumerate関数を反復処理する 
  10. インデックス、enumerate(num_list) の値:  
  11. # インデックスは現在の要素のインデックス、値は現在の要素の値です 
  12. print(インデックス, 値)

3. コレクションライブラリの利用

3.1 デキュー

deque は Python のキューです (FIFO、先入れ先出し)。キューの先頭をポップする場合、キューの方がリストよりも高速です。

特に BFS (深さ優先探索) を使用する場合は、キューを使用する必要があります。いくつかの deque 使用コードは次のとおりです。

  1. コレクションから deque をインポート 
  2. # 最大長3のキューを初期化する 
  3. d =両端キュー([1,2,3],最大長= 3 )  
  4. # 初期化されたキューの最大長は3なので、要素を追加すると先頭の要素が押し出されます。  
  5. d.append(4)  
  6. # 長さ無制限のキューを初期化する 
  7. d =デキュー()  
  8. # キューの最後に要素を追加する 
  9. d.append(1)  
  10. d.append(2)  
  11. d.append(3)  
  12. # キューの先頭の要素をポップして返します 
  13. print(d.popleft())  
  14. # 末尾の要素をポップして値を返す 
  15. 印刷(d.pop())  
  16. # キューの先頭に要素を挿入する 
  17. d.appendleft(0)

3.2 カウンター

カウンターは、シーケンスをカウントし、シーケンス内の要素の出現回数を計算できるカウンターです。

サンプルコードは次のとおりです。

  1. コレクションをインポートする 
  2. # 初期化方法は3つあります 
  3. # 1. シーケンスを渡す 
  4. print(collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))  
  5. # 2. 辞書を渡す
  6. print(コレクション.Counter({'a':2, 'b':3, 'c':1}))  
  7. # 3. 直接使用 = パラメータ渡し 
  8. print(コレクション.Counter( a = 2 , b = 3 , c = 1 ))  
  9. # パラメータなしで構築し、更新関数を使用して更新することもできます 
  10. c =コレクション.Counter ()  
  11. print('初期値:', c)  
  12. # 初期値: Counter()  
  13. c.update('abcdaab')  
  14. print('シーケンス:', c)  
  15. # シーケンス: Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})  
  16. c.update({'a':1, 'd':5})  
  17. print('辞書:', c)  
  18. # 辞書: カウンター({'d': 6, 'a': 4, 'b': 2, 'c': 1})  
  19. # 辞書にアクセスすることでCounterオブジェクトにアクセスできます 
  20. 'abcde' の文字の場合:
  21.   print('%s : %d' % (文字, c[文字]))  
  22. # elements() メソッドは、すべての Counter データを含むイテレータを返すことができます 
  23. c = collections.Counter ('非常に')  
  24. c['z'] = 0  
  25. print(リスト(c.elements()))  
  26. # ['e'、'e'、'e'、'm'、'l'、'r'、't'、'y'、'x']  
  27. # most_common() は、最も共通する上位n個のデータを返します 
  28. c =コレクション.Counter ('aassdddffff')  
  29. 文字の場合、c.most_common(2) でカウントします。  
  30. print('%s: %d' % (文字, カウント))  
  31. # 4 位 
  32. # 日: 3  
  33. # カウンター オブジェクトは、演算子 +、-、&、| を使用して加算、減算、交差、結合できます。  
  34. # + は 2 つの辞書内の同じ文字の出現回数を加算し、 - は最初のカウンターと 2 番目のカウンターの差を返します。共通部分は両方のカウンターに存在する要素を示し、カウントは小さい方のカウンターに割り当てられます。また、結合部分は 2 つのカウンターで最も頻繁に出現する要素を示します。  
  35. c1 =コレクション.Counter(['a', 'b', 'c', 'a', 'b', 'b'])  
  36. c2 = collections.Counter ('アルファベット')  
  37. 印刷 ('C1:', c1)  
  38. 印刷 ('C2:', c2)  
  39. print ('\n合計カウント:')
  40. 印刷 (c1 + c2)  
  41. print ('\n減算:')  
  42. 印刷 (c1 - c2)  
  43. print ('\n交差(正の最小値を取る):')  
  44. 印刷 (c1 & c2)
  45. print ('\nUnion (最大値を取る):')  
  46. 印刷 (c1 | c2)  
  47. # 出力は次のとおりです:  
  48. C1: カウンター({'b': 3, 'a': 2, 'c': 1})  
  49. C2: カウンター({'a': 2, 'l': 1, 'p': 1, 'h': 1, 'b': 1, 'e': 1, 't': 1})  
  50. 合計数:  
  51. カウンター({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})  
  52. 減算:  
  53. カウンター({'b': 2, 'c': 1})  
  54. 交差(正の最小値を取る):  
  55. カウンター({'a': 2, 'b': 1})  
  56. 結合(最大値を取る):  
  57. カウンター({'b': 3, 'a': 2, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})

3.3 defaultdict — デフォルト値を持つ辞書

通常、作成された辞書 dict にはデフォルト値は含まれません。つまり、辞書にキー a が含まれていない場合、dct{a} を呼び出すとエラーが発生します。

アルゴリズムやデータ構造を設計する際には、たとえそれが単なるデフォルト値であっても、任意のキーを辞書から取得できることが望まれます。このとき、defaultdict を使用する必要があります。

たとえば、グラフ内のノードに接続されたノードを辞書で表す場合、このノードをキーとして使用し、その値としてそれに接続されたノードのリストを作成します。このとき、defaultdict(list) を使用して、デフォルト値がリストである辞書を作成できます。

  1. # リストのデフォルト値は空のリストです 
  2. list_dict = collections.defaultdict (リスト)  
  3. # intのデフォルト値は0です 
  4. int_dict =コレクション.defaultdict (int)  
  5. 印刷(list_dict['a'])
  6. 印刷(int_dict['a'])  
  7. # 出力: []  
  8. # 出力: 0

3.4 まとめ

これらは、コレクション内のアルゴリズムやデータ構造を記述するためによく使用されるものです。ソートされた辞書や名前付きタプルなどの他のものはほとんど使用されません。

4. ソート

4.1 リストの並べ替え

リストをソートする方法は 2 つあります。1 つは、リストの組み込みソート関数を使用することです。ソート関数はリストを直接変更し、戻り値はありません。比較キーと比較関数は、パラメーター キーを通じてカスタマイズできます。

2つ目の方法は、Pythonのsorted関数を使う方法です。この関数は自由度が高く、比較関数や比較キーを自分で設定して新しいリストを返すことができます。

比較関数をカスタマイズする必要がある場合は、functools ライブラリから cmp_to_key 関数をインポートして、比較関数をキーに変換する必要があります。使用コードは次のとおりです。

  1. カスタムソートの定義(x,y):  
  2. x > yの場合:  
  3. # アイテムを前面に配置することを示すために -1 を返します 
  4. -1を返す 
  5. x < yの場合:    
  6. # アイテムを後ろに配置する必要があることを示すために1を返します 
  7. 戻り値 1  
  8. 0を返す 
  9. lst = [i は範囲(10, -1, -1)内のiの場合]  
  10. 印刷(lst)
  11. ソート()  
  12. 印刷(lst)  
  13. print(sorted(lst, key = cmp_to_key (custom_sort)))  
  14. # 出力は次のようになります。  
  15. # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  
  16. # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
  17. # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

4.2 辞書/タプルのリストのソート

辞書をソートする必要がある場合 (item 関数を使用して辞書をタプル リストに変換)、または各項目に 2 つの値があるタプル リストをソートする必要がある場合は、sorted 関数のキーを使用してソートする値を決定する必要があります。コードは次のとおりです。

  1. # 文字列を使用してカウンター辞書を作成する 
  2. d = dict (コレクション.Counter('Hello World'))  
  3. 印刷(d)  
  4. # ソート 
  5. print(sorted(d.items(), key = lambda x: x[1], reverse = True ))を印刷します。  
  6. # 出力は次のようになります。  
  7. # {'H': 1、'e': 1、'l': 3、'o': 2、' ': 1、'W': 1、'r': 1、'd': 1}  
  8. # [('l', 3), ('o', 2), ('H', 1), ('e', 1), (' ', 1), ('W', 1), ('r', 1), ('d', 1)]

5. 順列と組み合わせ

Python の組み込みモジュール itertools には、順列関数や組み合わせ関数など、いくつかの反復関連関数が統合されています。

5.1 配置

permutations 関数はリストを受け取り、リスト内のすべての要素の完全に順序付けられたリストを返します。

  1. itertoolsから順列をインポート 
  2. print(リスト(順列([1,2,3])))  
  3. # 出力は次のようになります。  
  4. # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

5.2 組み合わせ

組み合わせ関数 combinations は 2 つのパラメータを受け取ります。最初のパラメータは結合するリストで、2 番目のパラメータは結合するリストから抽出される要素の数を表す正の整数です。結合されたリストを返します。

  1. itertoolsからの組み合わせのインポート 
  2. print(リスト(組み合わせ([1,2,3],2)))  
  3. # 出力は次のようになります。  
  4. # [(1, 2), (1, 3), (2, 3)]

6. ヒント

6.1 Pythonには、可変型と不変型があります。関数にパラメータを渡す場合:

  • 文字列などの不変のデータ型の場合、パラメータが渡されたときにディープコピーが作成され、新しいデータに変更を加えても元のデータは変更されません。
  • リストなどの可変型の場合、パラメータを渡すときに参照が渡されるため、浅いコピーになります。関数内で新しいリストを操作すると、元のリストに影響します。

関数に変数型を渡す必要がある場合は、次のように関数の最初の行でディープコピーを作成できます。

  1. def test(num_list:リスト):  
  2. # ディープコピーを作成する 
  3. num_list num_list = num_list[:]

6.2 リスト内の要素を削除すると、リストの末尾の要素が自動的に前方に移動し、エラーが発生します。

たとえば、リストが [1,2,3,4,5,6] で、リスト内の偶数を削除したい場合、次のコード (間違ったデモンストレーション) に示すように、偶数を直接検索し、そのインデックスを使用して削除すると、申し訳ありませんが、問題が発生します。

  1. # これはエラーのデモです! ! ! ! ! ! ! !  
  2. 1番目= [1, 2, 3, 4, 5, 6]  
  3. iが範囲(len(lst))内にある場合:  
  4. lst[i] % 2 == 0の場合:  
  5. lst.pop(i)  
  6. 印刷(lst)  
  7. # 上記のコードは、インデックス範囲外エラーを報告しているため、出力はありません。

次のコードは正しいデモンストレーションです。

  1. 1番目= [1, 2, 3, 4, 5, 6]  
  2. lst = [i が i 内にある場合、i % 2 != 0]  
  3. 印刷(lst)  
  4. # 出力は次のようになります。  
  5. # [1, 3, 5]

より複雑なスクリーニング方法が必要な場合は、if i%2 !=0 を関数判定に変更し、関数内にスクリーニング方法を実装できます。

6.3 辞書要素にアクセスするにはgetメソッドを使用する

前述のように、通常の dict 辞書にはデフォルト値がないため、値を見つけるために角括弧を使用してキーを直接配置すると、エラーが発生する可能性があります。

この状況を回避するには、辞書のキーを使用して値を取得するときに、辞書の get 関数を使用する必要があります。

get 関数の最初のパラメータはキーで、2 番目のパラメータはオプションです (デフォルトは None)。渡されたキーが辞書に見つからない場合、2 番目のパラメータによって割り当てられた値が返されます。

7. まとめ

上記はPythonを使って練習問題を解いた際にまとめたものです。間違っている点がありましたらご指摘ください。

この記事は、私自身のための文書を作成するとともに、皆様にとっての利便性を提供することを目的としています。

私の公開アカウント[プログラマー]をフォローして、福祉に関する多くの知識を受け取ってください。

洛陽でございます。ご来訪ありがとうございます。

<<:  アフリカはパンデミックの最中に包括的な接続性を構築しており、明確な投資方針を持っている

>>:  ロボットは共感を持つことができるか?感情AIはどれくらい使えるのか?

ブログ    
ブログ    
ブログ    

推薦する

新たな自動運転ランキングが発表

最近、米国の市場調査機関であるナビガントリサーチが、自動運転の競争力に関する新たなランキングを発表し...

AIと「喧嘩」したくない?人々はどんなスマートホーム体験を望んでいるのでしょうか?

スマートホームの発展過程で、その定義は何度も変化してきました。当初のリモートコントロールの概念から、...

報告書は、2030年までにサイバーセキュリティの分野でAIが人間に取って代わる可能性があると予測している。

新型コロナウイルス肺炎の流行は社会全体の生産と生活に影響をもたらしています。企業は、感染拡大の影響を...

これらの業界をリードする大型モデルはすべて1つの会社によって「買収」されました

GPT-4 のリリースは AI の歴史に残る大きな出来事であることは間違いありません。しかし、時が経...

人工知能は、電力網とユビキタス電力のIoTの構築と開発にとって重要な方向性となるだろう

[[285204]]現在、モバイルインターネット、ビッグデータ、スーパーコンピューティングなどの新し...

集める! 2017 年の主要な AI イベントを総ざらい!(動画付き)

[[219484]] 2017 年に 1 年間眠っていたのに、突然目が覚めて、今年世界で最も誇るべ...

ガートナー 2019 人工知能成熟サイクルのトレンド

このガートナーのハイプサイクルは、AIが企業に及ぼすさまざまな影響を強調しています。ガートナーの 2...

テンセントの高性能グラフコンピューティングフレームワークPlatoとそのアルゴリズムの応用

[[318509]]プラトンについてテンセントの高性能グラフコンピューティングフレームワークPlat...

ロボットの魚は本物の魚よりも速く泳ぎます!人間の心筋細胞から作られた紙の魚は108日間自律的に泳ぐことができる

米国のハーバード大学とエモリー大学の研究者らが協力し、ヒト幹細胞から抽出した心筋細胞を使った「人工魚...

2020年に会話型AIはどのように発展するでしょうか?

会話型 AI は今日のイノベーションに不可欠な要素であり、多くの企業のビジネスを変革するでしょう。 ...

ZTouch創設チーム:私たちの価値観を守り、新世代のグローバル企業のデジタルインテリジェンスパートナーになる

今日のデジタル時代では、顧客獲得の方法はよりシンプルになりましたが、さまざまなプラットフォームでの煩...

人工知能はいつか本当に人間の教師に取って代わることができるのでしょうか?

中国は教育における人工知能の応用において徐々に優位に立っています。顔認識からスタートアップ、医療教育...

北京ソフトウェア協会が「人工知能委員会」の設立準備を進め、アジアインフォテクノロジーズの欧陽葉博士が委員長に選出される

10月26日、中国科学技術協会社会サービスセンターの支援を受けて、北京ソフトウェア情報サービス協会(...

ネットセレブ列車は強制的に停止させられた。ドローンの操縦はどれほど難しいのか?

最近、「重慶の人気列車がドローンに衝突され停止」する動画がインターネット上で広く出回っている。 [[...

サイバーセキュリティにおけるAI、機械学習、自動化

サイバーセキュリティのスキル不足は、政府を含むさまざまな地域、市場、セクターの組織に引き続き影響を及...