pythonデータ構造

pythonデータ構造

リスト

Pythonのリストは変更可能です。これは、文字列やタプルと区別するための最も重要な機能です。1つの文で、リストは変更できますが、文字列やタプルは変更できません。
以下はPythonのリストです

>>> a =[66.25,333,333,1,1234.5]>>>print(a.count(333), a.count(66.25), a.count('x'))210>>> 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]

注:リストを変更するための挿入、削除、並べ替えなどのメソッドには戻り値がありません。

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

listメソッドを使用すると、リストをスタックとして簡単に使用できます。スタックは特定のデータ構造として使用され、最初に入力された要素が最後に解放されます(最後に入力、最初に出力)。 append()メソッドを使用して、スタックの一番上に要素を追加します。インデックスを指定せずにpop()メソッドを使用すると、スタックの最上位から要素を解放できます。例えば:

>>> 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]

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

リストをキューとして使用することもできますが、キューに追加された最初の要素が最初に取り出されます(first in、first out)。dequeモジュールを使用してリストをキューに変換し、popleft関数を使用して要素を解放する必要がありますが、リストを取得します。そのような目的には効率的ではありません。リストの最後に要素を追加またはポップするのは高速ですが、リストの先頭から挿入またはポップするのは高速ではありません(他のすべての要素を1つずつ移動する必要があるため)。

>>> from collections import deque
>>> queue =deque(["Eric","John","Michael"])  #リストをキューモードに変換します
>>> queue.append("Terry")           #リストの最後に要素を追加します
>>> queue.append("Graham")>>> queue.popleft()                 #解放要素
' Eric'>>> queue.popleft()'John'>>> queue                           
deque(['Michael','Terry','Graham'])

リストの理解

リスト内包表記は、シーケンスからリストを作成する簡単な方法を提供します。一般に、アプリケーションプログラムは、特定のシーケンスの各要素にいくつかの操作を適用し、要素として取得した結果を使用して新しいリストを生成するか、特定の判断条件に従ってサブシーケンスを作成します。
各リスト内包表記の後にはforの式が続き、その後にforまたはif句が0個以上あります。返される結果は、式に基づいて、以下のforおよびifコンテキストから生成されたリストです。式でタプルを推定する場合は、括弧を使用する必要があります。
ここでは、リスト内の各値に3を掛けて、新しいリストを取得します。

vec=[1,2,3]
list1=[x*3for x in vec]  #リストの理解

print(list1)

動作結果:

[3, 6, 9]

上記の例から、いわゆる控除は、角括弧で記述された混合式であり、新しいリストオブジェクトを返すことがわかります(角括弧が使用されている場合)。

2次元リストを生成することもできます:

vec=[1,2,3]
list1=[[x,x**3]for x in vec] #リスト内包表記に角括弧を追加すると、2次元リストが生成されます

print(list1)

動作結果:

[[1, 1], [2, 8], [3, 27]]

シーケンス内の要素ごとに、メソッドを1つずつ呼び出すこともできます。

>>> freshfruit =['  banana','  loganberry ','passion fruit  ']>>>[weapon.strip()for weapon in freshfruit]  #メソッドを1つずつ呼び出す
[' banana','loganberry','passion fruit']

一部の要素は、ifステートメントを使用してフィルタリングできます。

>>>[3* x for x in vec if x >3]  #3より大きい要素のみを生成します
[12,18]>>>[3* x for x in vec if x <2]  #2つ未満の要素のみを生成します
[]

ループやその他のテクニックのデモンストレーションは次のとおりです。

>>> vec1 =[2,4,6]>>> vec2 =[4,3,-9]>>>[x*y for x in vec1 for y in vec2]   #これは二重ループであり、yループはxループにネストされています
[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 inrange(len(vec1))] #2つのリストの同じ添え字の要素を乗算するためのサイクル数としてvec1の長さを使用します
[8,12,-54]

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

# ここで、ラウンドの範囲は、小数点以下の桁数を定義します。
>>>[ str(round(355/113, i))for i inrange(1,6)]  #ラウンド関数によって生成された浮動小数点数をstr関数を介して文字列タイプに変換します
['3.1','3.14','3.142','3.1416','3.14159']

ネストされたリストの理解

Pythonリストは、2次元リストであるネストすることもできます。
次の例は、3X4マトリックスリストを示しています。

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

次の例では、3X4マトリックスリストを4X3リストに変換します。

print([[row[i]for row in matrix]for i inrange(4)])

動作結果:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

上記の変換は、リスト内包表記によって生成された新しいリストです。これに加えて、ループを使用して実装することもできます。

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

j=1for i inrange(4):for row in matrix:print("[",row[i],"]",end=" ")if j%3==0:print()
  j +=1

動作結果:

[ 1 ] [ 5 ] [ 9 ]  
[ 2 ] [ 6 ] [ 10 ]  
[ 3 ] [ 7 ] [ 11 ]  
[ 4 ] [ 8 ] [ 12 ]

次の例も実装できます。

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

transposed =[]for i inrange(4):
 transposed.append([row[i]for row in matrix]) #これは、リスト内包表記が生成された後、空のリストに新しい要素を追加するためのものです。

print(transposed)

動作結果:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

これを達成する別の方法がありますが、これはもっと面倒です。

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

transposed =[]for i inrange(4):

 transposed_row =[]for row in matrix:
  transposed_row.append(row[i]) #トラバースされた要素を空のリストに追加します
 transposed.append(transposed_row) #次に、このリストオブジェクトを追加します

print(transposed)

動作結果:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

デルステートメント

delステートメントを使用して、値ではなくインデックスでリストから要素を削除します。これは、pop()を使用して値を返すこととは異なります。 delステートメントを使用して、リストからカットを削除するか、リスト全体を空にすることができます(前に紹介した方法は、空のリストをカットに割り当てることです)。例えば:

>>> 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
[]

タプルとシーケンス

タプルは、いくつかのコンマ区切りの値で構成できます。次に例を示します。

>>> 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))

ご覧のとおり、ネストされた構造の正しい表現を容易にするために、タプルの出力には常に括弧があります。入力には括弧がある場合とない場合がありますが、通常は括弧が必要です(タプルがより大きな式の一部である場合)。

タプルの値が不変であることは誰もが知っていますが、タプルの値が可変オブジェクトの場合、可変オブジェクトの値を変更すると、タプルの値も変更されます。

a =[1,2,3,4]
b =[5,6,7,8]
c =[9,10,11,12]
tuple1 = a, b, c  #一緒に結合されたリストはタプルタイプになります

print(tuple1)
del b[1:4]  #ここで変更されたのはbリストの値です
print(tuple1)

動作結果:

([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12])  
([1, 2, 3, 4], [5], [9, 10, 11, 12])

コレクション

セットは、順序付けられておらず、要素を繰り返さないセットです。基本的な機能には、関係のテストと重複要素の排除が含まれます。
コレクションを作成するには、中括弧{}を使用する必要があります。注:空のセットを作成する場合は、{}の代わりにset()を使用する必要があります。後者は空の辞書を作成します。
以下は簡単なデモンストレーションです。

>>> basket ={'apple','orange','apple','pear','orange','banana'}>>>print(basket)                      #重複は自動的に削除され、コレクションの順序が狂っているため、印刷するたびに順序が異なる場合があります
{' orange','banana','pear','apple'}>>>'orange'in basket                 #メンバーを確認する
True
>>>' crabgrass'in basket
False

>>> # 以下に2セットの動作を示します
...>>> a =set('abracadabra')>>> b =set('alacazam')>>> 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の文字は同時に表示されない

セットは内包表記もサポートします。

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

辞書

もう1つの非常に便利な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)]) #リストはキーと値のペアのタプルであり、dictを介して辞書タイプに構築されます
{' sape':4139,'jack':4098,'guido':4127}

キーワードが単純な文字列である場合は、キーワード引数を使用してキーと値のペアを指定する方が便利な場合があります。

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

さらに、辞書の派生を使用して、任意のキーと値の式辞書を作成できます。

>>>{ x: x**2for x in(2,4,6)}  #xがキーで、xの2乗が値です
{2:4,4:16,6:36}

トラバーサルスキル

辞書をトラバースするとき、items()メソッドを使用してキーワードと対応する値を同時に読み取ることができます:

>>> knights ={'gallahad':'the pure','robin':'the brave'}>>>for k, v in knights.items():  #各サイクルは、キー値のペアを読み取ることができます
... print(k, v)...
gallahad the pure
robin the brave

シーケンスをトラバースする場合、enumerate()関数を使用して、添え字の位置と対応する値を同時に取得できます。

>>> for i, v inenumerate(['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 inzip(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.

シーケンスを逆方向にトラバースするには、最初にシーケンスを指定してから、reversed()関数を呼び出します。reverseはシーケンスを逆にするために使用されます。

>>> for i inreversed(range(1,10,2)):...print(i)...97531
list1 =[1,2,3,4,5,6]for i inreversed(list1):print(i, end=" ")

動作結果:

6 5 4 3 2 1

シーケンスを順番にトラバースするには、sorted()関数を使用して、元の値を変更せずにソートされたシーケンスを返します。sortedはソートに使用されます。sort関数との違いは、sortedが新しいリストを生成することです。

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

sort関数は、元のリストのみをソートし、新しいリストオブジェクトを生成しません。

list2 =[84,56,12,65,2,4,85,123]
list.sort(list2)for x in list2:print(x, end=" ")

動作結果:

2 4 12 56 65 84 85 123

Recommended Posts

pythonデータ構造
Pythonの一般的なデータ構造の照合
Pythonのデータ構造とアルゴリズム
02.Pythonデータタイプ
Pythonデータモデル
Pythonデータ形式-CSV
Pythonデータ分析-データ更新
Pythonデータ分析-関数の適用
Pythonデータ分析-データ選択
Pythonデータ分析-データ確立
Pythonデータサイエンス:ニューラルネットワーク
Python解析可変長構造
Python3クローラーデータクリーニング分析
Pythonは単純なXMLデータを解析します
Pythonデータサイエンス:ロジスティック回帰
Pythonデータサイエンス:正規化方法
Pythonデータサイエンス:線形回帰
PythonFakerデータ偽造モジュール
Pythonデータサイエンス:Chi-Square Test
Pythonデータサイエンス:線形回帰診断
Pythonはオンラインマイクロブログデータの視覚化を実現します
pythonはデータマイニングに適していますか
Pythonマルチスレッド
Python CookBook
Python FAQ
Python3辞書
Python3モジュール
python(you-get)
Pythonでデータ分析レポートを自動的に生成する
Python文字列
npy形式のデータ例へのPythonアクセス
Python記述子
Pythonの基本2
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Pythonデコレータ
Python IO
Pythonマルチスレッド
Pythonツールチェーン
Python3リスト
Pythonマルチタスク-日常
Pythonの概要
pythonの紹介
Pythonアナリティック
Pythonの基本
07.Python3関数
Pythonの基本3
ビッグデータ分析用のJavaまたはPython
Pythonマルチタスクスレッド
Pythonはパンダを使用してExcelデータを処理します
Python関数
python sys.stdout
python演算子
Pythonエントリ-3
Centos 7.5 python3.6
Python文字列
pythonキューキュー
Pythonの基本4
Pythonの基本5