Latest web development tutorials

python3データ構造

この章では、主に私たちはPythonのデータ構造を導入する以前に学んだ知識と組み合わされます。


リスト

、リストを変更することができますが、文字列やタプルができません:Pythonのリストには、最も重要な機能は、文字列やタプル、すなわち、一つの文章と区別している、変数です。

ここではPythonのリストです:

ウェイ 説明
list.append(x)は、 = [X]:[LEN(A)]と同じリストの末尾にアイテムを追加します。
list.extend(L) リストを展開するには指定されたリストのすべての要素を追加することで、[LEN(A):]の当量= L.
list.insert(I、x)は、 指定された場所にある項目を挿入します。 最初のパラメータは、このようなa.insertなどの要素の前にそのインデックスに挿入されるようにされている(0、x)はリスト全体の前に挿入されますが、a.insert(lenが(a)は、x)は(a.appendと同等ですX)。
list.remove(x)は、 値xは、リストの最初の要素を削除します。 そのような要素が存在しない場合は、エラーを返します。
list.pop([i])と このリスト内の指定された位置から要素を削除して、それを返します。 インデックスを指定しない場合は、a.pop()は最後の要素を返します。 要素はすぐにリストから除去されました。 (私の周りの角括弧のメソッドは、パラメータを使用すると、角括弧を入力する必要があることを、あなたは多くの場合、Pythonライブラリリファレンスでこの表記法が表示されない、任意であることを示しています。)
list.clear() デルに等しいリスト内のすべての項目、削除[:]を。
list.index(x)は、 最初の要素のxの値を持つリストのインデックスを返します。 一致する要素がエラーを返しません場合。
list.count(x)は、 回xの数がリストに表示されます返します。
list.sort() ソートするリスト内の要素。
list.reverse() リスト内の反転要素。
list.copy() リストの浅いコピーがに等しい返し[:]。

次の例では、メソッドリストのほとんどを示しています。

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

注:類似等なく、戻り値、挿入、削除、またはリスト方式のソートを変更することができます。


スタックとしてリストを使用します

簡単にスタックとして使用することができるリストのリストを作成する方法、具体的なデータ構造としてスタック、リリースされる最後の要素(LIFO)を入力する最初の。 スタックの先頭に要素を追加することができます追加()メソッドを使用します。 ポップの明示的なインデックスなし()メソッドはスタックの先頭からアイテムを取得することができます。 例えば:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

キューとしてリストを使用します

リストは、キューとして使用することができ、キューは、要素を取り出し、最初に参加する最初のものです。目的は効率的ではないようしかし、このリストを取ります。 リスト内の(他のすべての要素を1つずつを移動する必要があるため)、挿入したり、ヘッドスピードから排出するために、しかし、スピードのリストまたはポップアップ要素の最後に追加することは速くありません。

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

リスト内包

リスト内包は、シーケンスからリストを作成するための簡潔な方法を提供します。 一部のアプリケーションでは、一般的に新しいリストを生成する、または決意の条件に応じて決定する配列を作成するための要素として得られる結果と、操作のシーケンスの各要素に適用されます。

各リストの内包表記は、式、または句の場合、ゼロ以上とするための後です。 結果は式に従ってのためとあれば、その後のコンテキストから生成されたリストです。 あなたはタプルの式をしたい場合には、括弧を使用する必要があります。

ここでは、新しいリストを取得するには、3によってそれぞれ番号が一覧表示されます:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

今、私たちは少しトリックをプレイ:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

ここでは、シーケンスの各要素に対して個別にメソッドを呼び出します。

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

私たちは、フィルタとして、if節を使用することができます。

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

ここではサイクリングや他のスキルにいくつかのデモは、次のとおりです。

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

リスト内包は、複雑な式またはネストされた関数を使用することができます。

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

ネストされたリストの内包

Pythonのリストを入れ子にすることもできます。

次の例では、3×4の行列のリストを示しています。

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

次の例では、4x3の変換リストに3×4の行列を示しています。

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

次の例は、以下の方法を使用できます。

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

もう一つの方法:

>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

デル声明

あなたは、リストから要素を削除する代わりに、値のインデックスによってデル文を使用することができます。 これは、ポップの使用である()は、異なる値を返します。 あなたは(プレゼンテーションの我々の以前の方法は、空のリストにカットを割り当てられている)リストからカットを削除、またはリスト全体をクリアするには、デルのステートメントを使用することができます。 例えば:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

また、デルでインスタンス変数を削除することができます。

>>> del a

タプルとシーケンス

カンマ区切り値のタプル数は、たとえば、構成されています。

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

ご覧のとおり、出力タプルになかれ正しく入れ子構造を表現するために、括弧で囲まれています。 (タプルは、より大きな式の一部である場合)そこには、大カッコまたは入力しなくてもよいが、ブラケットは、通常必要とされます。


セット

コレクションは、ユニークな要素の順序なしコレクションです。 基本的な機能は、テストと重複する要素を排除することが含まれます。

あなたは、中括弧のセットを作成することができます({})。 注:空のセットを作成したい場合は、代わりに{}の)セットを(使用する必要があります。空の辞書を作成する、次のセクションで、私たちはこのデータ構造を紹介します。

以下は、簡単なデモです。

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 删除重复的
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 检测成员
True
>>> 'crabgrass' in basket
False

>>> # 以下演示了两个集合的操作
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # a 中唯一的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 在 a 中的字母,但不在 b 中
{'r', 'd', 'b'}
>>> a | b                              # 在 a 或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 在 a 和 b 中都有的字母
{'a', 'c'}
>>> a ^ b                              # 在 a 或 b 中的字母,但不同时在 a 和 b 中
{'r', 'd', 'b', 'm', 'z', 'l'}

コレクションはまた、式の導出をサポートしています。

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

辞書

Pythonのに組み込まれた別の有用なデータ型は辞書です。

整数インデックスの連続したシーケンス、この差は、キーワード辞書インデックス付けのキーワードは、通常、文字列または数値で、任意の不変タイプにすることができ、です。

辞書としてそれを理解する最良の方法は、順序付けられていないキー=>値のペアです。 同じ辞書では、キーが互いに異なっている必要があります。

{}:中括弧のペアは空の辞書を作成します。

これは、辞書の使用の簡単な例です:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

キータプルのリストから直接、辞書を構築するためにコンストラクタのdictの()。 あなたは固定パターンを持っている場合は、リストの内包は、特定のキーと値のペアを指定します。

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}

また、辞書はキーと値の任意の辞書を導出する式を作成するために使用することができます。

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

キーワードは、単に指定することが時にはより便利なキーワード引数を使用して、キーと値のペアの文字列である場合:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

トラバーサル技術

辞書で横断するときは、キーと対応する値は、同時通訳アウトするための項目()メソッドを使用することができます。

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

順番に横断するときに、位置インデックスと対応する値は、列挙を()関数はまた、受信に使用することができます。

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

2つ以上の配列を横断中は、組み合わせでのzip()を使用することができます。

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

逆の順番を横断するには、最初のシーケンスを指定し、[reversesd()関数を呼び出します。

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

順序に従ってシーケンスを横断する、ソート()関数を使用すると、ソートされたシーケンスを返し、元の値を変更しません。

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

マニュアルを参照してください