パート1 | パート2 | パート3 | パート4 |
---|
コレクションを勉強する際の一般的な問題は、各タイプをある程度詳細に分析した後、通常、全体像の説明に十分な注意が払われず、タイプ間の明確な類似性と違いが得られないことです。 。
これはまさにこのシリーズの記事で解決しようとしている問題です-トレーニング資料で通常示されているように、異なるタイプのコレクションを比較するのではなく、異なるタイプのコレクションを比較してPythonで標準コレクションを操作するためのいくつかのアプローチを検討します。 さらに、初心者に困難や間違いを引き起こすいくつかのポイントに触れてみます。
誰のために: Pythonを勉強していて、コレクションの初期アイデアをすでに持っており、彼らと協力し、体系化して知識を深めたい人のために、それらを完全なイメージに入れてください。
Python の標準の組み込みコレクションデータ型を検討します:リスト(リスト)、タプル(タプル)、文字列(ストリング)、セット(セット、フローズンセット)、辞書(辞書)。 collectionsモジュールからのコレクションは考慮されませんが、記事の多くはそれらの操作に適用できるはずです。
目次:
- コレクションの分類。
- コレクションを操作するための一般的なアプローチ。
- コレクションの一部の一般的な方法。
- コレクションを変換します 。
1.コレクションの分類
用語の説明:
インデックス付け -コレクションの各要素には独自のシリアル番号-インデックスがあります。 これにより、序数のインデックスで要素にアクセスし、スライス(「スライス」)を実行できます。インデックスに基づいて選択することでコレクションに参加できます。 これらの問題については、別の記事で詳しく説明します。
一意性 -コレクションの各要素は、その中に1回だけ見つかります。 これにより、使用されるデータ型が各要素に対して変更されないという要件が生じます。たとえば、リストをそのような要素にすることはできません。
コレクションの可変性 -コレクションに新しいメンバーを追加したり、コレクションの作成後にそれらを削除したりできます。
辞書に関する注(dict):
- 辞書自体は変更可能です-新しいペアを追加/削除できますkey:value;
- 辞書要素の値は可変であり、一意ではありません。
- しかし、キーは変更可能で一意ではないため、たとえば、辞書キーを使用してリストを作成することはできませんが、タプルは作成できます。 キーの一意性から、辞書要素の一意性も続きます-キー:値のペア。
UPD: sakutylevからの重要な注意 :オブジェクトを辞書キーにするためには、ハッシュする必要があります。 タプルでは、要素がハッシュ可能なオブジェクトではない場合が考えられます。したがって、タプル自体もハッシュ可能ではなく、辞書キーとして機能できません。
a = (1, [2, 3], 4) print(type(a)) # <type 'tuple'> b = {a: 1} # TypeError: unhashable type: 'list'
- UPD:注意してくれてありがとうmorff- {}値なしで値を持つ辞書を作成し、構文に応じて、セットまたは辞書のいずれかを作成できます:
a = {} print(type(a)) # <class 'dict'> b = {1, 2, 3} print(type(b)) # <class 'set'> c = {'a': 1, 'b': 2} print(type(c)) # <class 'dict'>
2コレクションを操作するための一般的なアプローチ
分類を理解したら、タイプに関係なく標準コレクションでできることを検討してください(例ではリストと辞書ですが、これは考慮される他のすべての標準タイプのコレクションで機能します)。
# ( ): my_list = ['a', 'b', 'c', 'd', 'e', 'f'] my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
2.1 print ()関数を使用したコレクション要素の印刷
print(my_list) # ['a', 'b', 'c', 'd', 'e', 'f'] print(my_dict) # {'a': 1, 'c': 3, 'e': 5, 'f': 6, 'b': 2, 'd': 4} # , .
2.2 len ()関数を使用してコレクション内のメンバーの数を数える
print(len(my_list)) # 6 print(len(my_dict)) # 6 - - . print(len('ab c')) # 4 - 1
2.3 in演算子を使用してこのコレクションの要素の所有権を確認する
x in s-アイテムがコレクションsにある場合はTrueを返し、そうでない場合はFalseを返します
非所有権をチェックするオプションもあります。xはsにありません。実際には、前の式のブール値の前に否定だけが追加されます。
my_list = ['a', 'b', 'c', 'd', 'e', 'f'] print('a' in my_list) # True print('q' in my_list) # False print('a' not in my_list) # False print('q' not in my_list) # True
辞書のオプションは、以下のコードから明らかです。
my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} print('a' in my_dict) # True - print('a' in my_dict.keys()) # True - print('a' in my_dict.values()) # False - '' — , print(1 in my_dict.values()) # True
カップルを確認できますか? できます!
print(('a',1) in my_dict.items()) # True print(('a',2) in my_dict.items()) # False
文字列の場合、1文字だけでなく部分文字列も検索できます。
print('ab' in 'abc') # True
2.4 for inループですべてのコレクションアイテムをバイパスする
この場合、コレクションの要素は、すべての要素が列挙されるまでループを順番にループします。
for elm in my_list: print(elm)
次の点に注意してください。
- インデックス化されていないコレクションのアイテムの処理順序は、作成時と同じではありません
- 辞書の一節には独自の特徴があります。
for elm in my_dict: # , # for elm in my_dict.keys() print(elm) for elm in my_dict.values(): # print(elm)
しかし、ほとんどの場合、キー(キー)-値(値)のペアが必要です。
for key, value in my_dict.items(): # .items() (, ), # key, value print(key, value)
- 考えられるエラー :同じコレクションの反復中にループ本体のコレクション要素の数を変更しないでください! -これにより、一見しただけでは必ずしも明らかではないエラーが発生します。
このような副作用を避けるために、例えば、コレクションのコピーを繰り返すことができます:
for elm in list(my_list): # my_list, # .
2.5関数min ()、 max ()、 sum ()
- 関数min ()、 max ()-最小要素と最大要素をそれぞれ検索します-数値だけでなく、文字列値も機能します。
- sum ()-すべて数値の場合、すべての要素の合計。
print(min(my_list)) # a print(sum(my_dict.values())) # 21
3部品コレクションの一般的な方法
同じタイプの問題を解決するために、コレクションタイプの多くのメソッドが複数のコレクションで使用されます。
UPD:3番目の記事の重要な追加: 可変コレクションへのアイテムの追加と削除 。
メソッドと例の説明:
- 。 count ()-一意でないコレクション(文字列、リスト、タプル)の特定の要素をカウントする方法。コレクションで要素が見つかった回数を返します。
my_list = [1, 2, 2, 2, 2, 3] print(my_list.count(2)) # 4 2 print(my_list.count(5)) # 0 -
- 。 index ()-インデックス付きコレクション(文字列、リスト、タプル)に渡されたアイテムの最小インデックスを返します
my_list = [1, 2, 2, 2, 2, 3] print(my_list.index(2)) # 2 1 ( !) print(my_list.index(5)) # ValueError: 5 is not in list - !
- 。 copy ()-メソッドは、コレクション(リスト、辞書、両方のタイプのセット)の浅い(再帰的ではない)コピーを返します。
my_set = {1, 2, 3} my_set_2 = my_set.copy() print(my_set_2 == my_set) # True - - print(my_set_2 is my_set) # False - - id
- 。 clear ()-コレクションからすべての要素を削除し、それを空のコレクションに変える可変コレクション(リスト、辞書、セット)のメソッド。
my_set = {1, 2, 3} print(my_set) # {1, 2, 3} my_set.clear() print(my_set) # set()
セットを比較するための特別な方法(set、frozenset)
- set_a。 isdisjoint (set_b)-set_aとset_bに共通の要素がない場合はtrue。
- set_b。 issubset (set_a)-set_bのすべての要素がset_aに属する場合、set_bは完全にset_aの一部であり、そのサブセットです(set_bはサブセットです)
- set_a。 issuperset (set_b)-それぞれ、上記の条件が真の場合、set_aはスーパーセットです
set_a = {1, 2, 3} set_b = {2, 1} # ! set_c = {4} set_d = {1, 2, 3} print(set_a.isdisjoint(set_c)) # True - print(set_b.issubset(set_a)) # True - set_b set_a, set_b - print(set_a.issuperset(set_b)) # True - set_b set_a, set_a -
セットが等しい場合、それらは同時にサブセットとスーパーセットの両方になります。
print(set_a.issuperset(set_d)) # True print(set_a.issubset(set_d)) # True
4あるタイプのコレクションを別のタイプに変換する
課題に応じて、あるタイプのコレクションを別のタイプのコレクションに変換できます。 このため、原則として、あるコレクションを別のコレクションを作成する機能に転送するだけで十分です(上記の表にあります)。
my_tuple = ('a', 'b', 'a') my_list = list(my_tuple) my_set = set(my_tuple) # ! my_frozenset = frozenset(my_tuple) # ! print(my_list, my_set, my_frozenset) # ['a', 'b', 'a'] {'a', 'b'} frozenset({'a', 'b'})
あるコレクションを別のコレクションに変換すると、データが失われる可能性があることに注意してください。
- セットには一意の要素のみが含まれているため、セットに変換すると、重複した要素は失われます! 実際、一意性の確認は通常、必要性のあるタスクで多く使用する理由です。
- インデックス付きコレクションをインデックスなしコレクションに変換すると、要素の順序に関する情報が失われ、場合によっては重要になることがあります!
- 不変の型に変換した後、コレクションの要素を変更することはできなくなります-新しい要素を削除、変更、追加します。 可変コレクションで動作するように記述されている場合、データ処理関数でエラーが発生する可能性があります。
追加の詳細:
- 上記の方法は、キーと値のペアで構成されているため、 ディクショナリの作成には機能しません。
この制限は、zip()を使用してキーと値を組み合わせた辞書を作成することで回避できます。
my_keys = ('a', 'b', 'c') my_values = [1, 2] # - # - my_dict = dict(zip(my_keys, my_values)) print(my_dict) # {'a': 1, 'b': 2}
- 別のコレクションから行を作成します。
my_tuple = ('a', 'b', 'c') my_str = ''.join(my_tuple) print(my_str) # abc
- 考えられる間違い :コレクションに変更可能な要素(リストのリストなど)が含まれている場合、その要素は変更可能であるため、変更不可能なコレクションに変換できません!
my_list = [1, [2, 3], 4] my_set = set(my_list) # TypeError: unhashable type: 'list'
注 :最も強力で柔軟な方法-コレクションジェネレーターは、サイクルの4番目の部分で個別に検討されます。これは、詳細な分析にほとんど焦点を当てず、必要とするニュアンスやユースケースが多いためです。
UPD: コメントの ShashkovSは、コレクションの操作のアルゴリズムの複雑さに関する重要で有用な情報へのリンクを投稿しました。
パート1 | パート2 | パート3 | パート4 |
---|
ディスカッションに招待します。
- 私がどこかで間違えたか、重要なことを考慮しなかった場合-コメントを書いてください。重要なコメントは、著者名を示す記事の後半に追加されます。
- 明確でない点があり、説明が必要な場合は、コメントに質問を書いてください。または、私または他の読者が答えを出すと、答えのある実用的な質問が後で記事に追加されます。