elemは単語element(要素)の略称であり、プログラムの定義では不確定な型、つまり抽象的なデータ型を表します。
リスト
定義
順番に並べられた要素からなるコンテナ
- 要素は任意の型で可能
- 要素は確定した順序で並び、順序性を持つ
リストの作成
空のリストインスタンスを作成してから要素を追加する
- list()
- .append()メソッド
>>>wife = list()#インスタンス化
>>>wife.append("西宮硝子")
>>>wife.append("櫻島麻衣")
>>>wife.append("愛莉希雅")
>>>wife
['西宮硝子','櫻島麻衣','愛莉希雅']
直接リストを定義して要素を埋める
>>> phones = ["Apple", "Huawei", "Xiaomi"]
>>> phones
['Apple', 'Huawei', 'Xiaomi']
要素の確認
- インデックスの使用 $[i]$でi+1番目の要素を確認
- index()メソッド $$name.index(x)$$ list name内で最初に値がxとなる要素を検索し、そのインデックスを返す
- count()メソッド $$name.count(x)$$ list name内で値がxとなる要素がいくつあるかを確認し、その数を返す
- len()メソッド $$name.len()$$ list name内の要素の総数を検索し、その数を返す
新しい要素の追加
- append()メソッド $$name.append(x)$$ nameの末尾に要素xを追加する
- insert()メソッド $$name.insert(i,x)$$ オブジェクトxをnameのインデックスiの位置に挿入し、元のiおよびi以降の要素を順番に後ろに移動させる
- extend()メソッド $$name.extend(name2)$$ リストname2をリストnameの後ろに連結する
要素の変更
- インデックスを指定して要素を直接代入して変更する
要素の削除
- pop()メソッド $$name.pop()$$ デフォルトでlistの最後の要素を削除 $$name.pop(i)$$ インデックスがiの要素を削除し、後ろの要素を順番に前に移動
- remove()メソッド $$name.remove(x)$$ 最初に値がxである要素を削除し、後ろの要素を順番に前に移動
- clear()メソッド $$name.clear()$$ すべての要素を削除(listを空にする)
- del文 $$del\ name[a:b]$$ delインデックス$[a,b)$の要素を削除、aを含みbを含まない $del\ name[:]$はlistを空にすることを意味する $$del\ name[i]$$ インデックスがiの要素を削除
リストの反転
- reverse()メソッド $$name.reverse()$$ リストnameを反転させ、最後の要素が最初の要素になり、以降も同様に順番が逆になります。
- スライス法
>>> nums=[1,2,3,4,5]
>>> new_nums=nums[::-1]
>>> new_nums
[5,4,3,2,1]
元のオブジェクトnumsは変更されず、反転されたリストとして新しいオブジェクトnew_numsが生成されます。
リストのソート
- sort()メソッド $$name.sort()$$ $$name.sort(cmp=None,key=None,reverse=False)$$
このメソッドは戻り値がなく、元のlistを直接変更します
cmpはオプションのパラメータです
keyは要素のどのパラメータを比較の重みとして使用するかを指定し、比較可能なオブジェクトから取られる単一のパラメータです
- 比較要素elemが単一のパラメータ(数字や単一の文字など)のみを含む場合、keyパラメータは省略可能です。
# リストの2番目の要素を取得
def takeSecond(elem):
return elem[1]
# リスト
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 2番目の要素でソートを指定
random.sort(key=takeSecond)
#関数takeSecondを通じてタプルの2番目の要素(重み)を比較するように指定
# リストを出力
print('ソートされたリスト:')
print(random)
ソートされたリスト:
[(4, 1), (2, 2), (1, 3), (3, 4)]
- reverseはソートのルールで、デフォルトはFalseで昇順、Trueは降順です
タプル
定義
タプル(tuple)は、一連の要素を順番に並べて形成されるコンテナです。 タプルは不変(immutable)であり、リストは可変(mutable)です。
タプルの作成
- 直接$()$ですべての要素を囲むことで作成、リストの作成は$[]$を使用
- 時には$()$を使用しなくてもタプルを作成できる(非推奨)
- タプルの内包表記
atuple=(i+1 for i in range(31,42))
- 作成するタプルが1つのオブジェクトのみを含む場合、その後にカンマ$","$を追加 そうしないと、括弧付きオブジェクトのデータ型はタプルではなくオブジェクト型になる
- 空のタプルを作成
a=tuple()
b=()
tupleは増減改査を許可しません
tupleとlistの変換
tuple->list
atuple=(1,'love',3.334,'Y')
list(atuple)
'''この時atupleは依然としてtuple型'''
alist=list(atuple)
'''alistはlist型'''
print(atuple)
出力(1, 'love', 3.334, 'Y')
print(alist)
出力[1, 'love', 3.334, 'Y']
list->tuple
alist=['I',2,3.1415,'polaris']
atuple=tuple(alist)
'''alistは依然としてlist、atupleはtuple'''
dict
定義
- 辞書(dict)、一連のキーと値のペア(key-value) で構成されるデータ構造です。
- キーはハッシュ可能な値でなければなりません。例えば==文字列==や数値など。
- ハッシュ:任意の長さの入力をハッシュ(散列)アルゴリズムを通じて固定長の出力(ハッシュ値)に変換すること。 ハッシュは一種の圧縮マッピングです。
- 値は任意のオブジェクトを指定できます。
辞書の作成
- 空の辞書を作成してから要素を追加する 識別子とオブジェクト(key&value)を等号で接続することに注意 この場合、keyは識別子であり、識別子の文字列には引用符を付けない
- 直接中括弧$\{\}$を使用する keyとvalueをコロンで接続することに注意 この場合、コロンの前がkeyであり、文字列には引用符が必要
- dict()関数を使用してキーと値のシーケンス(tuple、listなど)からdictを作成する
profile=dict(name='孤筝',age=19,爱好='明月栞那')
profile={name:'孤筝',age:19,爱好:'明月栞那'}
alist=[('name','孤筝'),('age',19),('爱好','明月栞那')]
profile=dict(alist)
この場合、alistはlistのまま、profileオブジェクトはdict
print(profile)
出力{'name':'孤筝','age':19,'爱好':'明月栞那'}
- 辞書内包表記
adict={i:i**2 for i in range(2,5)}
print(adict)
出力{2:4,3:9,4:16,5:25}
要素の確認
- $$dict[key]$$を使用 dictは辞書名、keyはキー keyが存在しない場合、KeyValueエラーが発生
- $dict.get(key[,value])$を使用 dictは辞書名、keyはキー、valueはオプションパラメータで初期値 keyが存在しない場合、設定したvalueを返し、valueが設定されていない場合はNoneを返す ==キーが辞書に存在しない場合、キーが追加され、valueがデフォルト値に設定されます。==
新しい要素の追加
$$dict[key]=value$$keyは新しいキーで、valueは対応する値です
要素の変更
$$dict[key]=new\_value$$要素の削除
- $dict.pop(key)$ dictは辞書名、keyはキーで、文字列には引用符が必要
- del関数 $$del\ dict[key]$$ dictは辞書名
その他の重要な方法
keyの存在を確認する
- $in,not in$
- $dict.has\_key()$関数 存在すればTrueを返し、存在しなければFalseを返す ==Python2でのみ使用可能、Python3では削除==
keyのデフォルト値を設定する
- まずkeyがdictに存在するかどうかを確認し、存在しない場合は値を割り当てる
profile = {"name": "王炳明", "age": 27, "公众号": "Python编程时光"}
if "gender" not in profile:
profile["gender"] = "male"
- $setdefault()$メソッド $$dict.setdefault(key,default=None)$$ defaultはkeyが存在しない場合に設定する値で、デフォルトはNone
set
定義
集合(set)は、数学の集合と同じく、順序付けされていない、重複のない要素のシーケンスです。 ==question==:順序がない場合、print setの際に要素はどのような順序で表示され、保存時はどのような順序になるのでしょうか?
集合の作成
- 波括弧を使用して作成します。$\{\}$内に重複した要素を含めることができますが、最終的にsetは重複を削除します。
- set()メソッドを使用して作成します。
aset={1314,'520'}
print(aset)
出力:
{1314,'520'}
bset=set()#空の集合asetを作成
print(bset)
出力:
set()
cset=set(['I','love','ishimiya'])
print(cset)
出力:
{'I','love','ishimiya'}
要素の追加
$.add()$関数
$$set.add(elem)$$==question==:elemが既存のset要素の場合、何が起こるか? 注意:追加する要素がset集合内の要素と重複する場合、何の効果もないが、エラーは発生しない。
追加する要素は不変型でなければならない。可変型の要素を追加するとエラーが発生する。
$.update()$関数
$$set.update(ElemType)$$ElemTypeはシーケンス(string、list、tuple、dict、setなど)でなければならない。
aset={'朱冰倩'}
aset.add('suki')
aset.update({'for'})
'''集合{'for'}を追加'''
aset.update([10000])
'''リスト[10000]を追加'''
aset.update(('years',))
'''タプルを追加、要素が1つの場合カンマを付ける'''
aset.update({'name':'guzheng','age':19})
'''辞書を追加、keyのみsetに追加される'''
print(aset)
出力:
{'朱冰倩','suki','for',10000,'years','name','age'}
要素の削除
- $.remove()$
aset={'朱冰倩','suki','for',10000,'years','name','age'}
aset.remove('name')
aset.remove('爱')
'''存在しない要素をremoveするとエラーが発生する'''
KeyError: '愛'
- $.discard()$ 要素が存在すれば削除し、存在しなくてもエラーにならない
aset={'朱冰倩','suki','for',10000,'years','age'}
aset.discard('age')
aset.discard('love')
- $.pop()$ 集合からランダムに要素を削除し、パラメータを渡すことはできない
aset={'朱冰倩','suki','for',10000,'love'}
aset.pop()
print(aset)
出力例:
{'朱冰倩','suki','for',10000}
- $.clear()$ 集合内の要素をすべて削除する $$set.clear()$$
要素の変更
セット内の要素は順序がないため、集合にはインデックスがなく、要素を変更することはできず、追加または削除のみ可能です。
要素の確認
同上、インデックスなしでは要素を確認できません。 要素数の確認
$$len(set)$$セット内の要素数を返します
集合演算
和集合
$union$関数を使用して2つの集合を結合し重複を削除し、結合後の集合Cを返します
$$aset.union(bset)$$同等
$$aset\ |\ bset$$差集合
$difference$関数を使用して差集合を求めます:==集合Aに存在する==が==集合Bには存在しない==要素を見つけ、新しい集合Cとして返します。
$$aset.difference(bset)$$同等
$$aset\ -\ bset$$積集合
- $intersection$関数を使用して積集合を求めます:==集合AとBの両方に存在する==要素を見つけ、集合Cとして返します。 $$aset.intersection(bset)$$ または $$bset.intersection(aset)$$ 同等 $$aset\ \&\ bset$$ $$bset\ \&\ aset$$
- $intersection\_update$関数を使用して積集合を求めます:積集合を見つけasetに代入し、積集合を返しません。 $$aset.intersection\_update()$$
- $\&$を使用し、積集合を返しますがaset、bsetは変更しません $$aset\ \&\ bset$$
対称差集合
- $symmetric\_difference$関数を使用し、対称差集合を返します $$aset.symmetric\_difference(bset)$$
- $symmetric\_difference\_update$関数を使用し、対称差集合をasetに返します $$aset.symmetric\_difference\_update(bset)$$
その他
- setが特定の要素を含むかどうかを判断するには、inを使用します $$print(elem\ in\ aset)$$
- 2つのsetに共通の要素があるかどうかを判断します $$aset.isdisjoint(bset)$$ 共通の要素がある場合はFalseを返します
- bsetがasetの部分集合かどうかを判断します $$bset.issubset(aset)$$ bsetがasetの部分集合である場合、Trueを返します
イテレータ
イテレータ
反復可能オブジェクト
forループを利用できるオブジェクトは、すべて反復可能オブジェクトと呼ばれます。
反復可能プロトコル
- 最初のシナリオ:あるオブジェクトが内部で
__iter__()メソッドを実装し、イテレータインスタンスを返す場合、そのオブジェクトは反復可能オブジェクトです。- このシナリオでは、
isinstance(my_list,Iterable)はTrueを返します
- このシナリオでは、
- 2番目のシナリオ:あるオブジェクトが
__iter__()を実装していない場合、Pythonインタプリタは__getitem__()メソッドを使用して要素を取得します。これが可能であれば、そのオブジェクトも反復可能オブジェクトです。- このタイプの反復可能オブジェクトの場合、
isinstance(my_list,Iterable)はFalseを返します
- このタイプの反復可能オブジェクトの場合、
イテレータオブジェクト
反復可能なオブジェクトに対してiter関数を使用すると、イテレータオブジェクトが返されます。イテレータオブジェクトに対してはnext関数を使用して要素を取得できます。実行するたびに1つずつ要素を取得し、すべて取得し終わるとStopIterationが発生し、これ以上要素がないことが通知されます。
alist=['人','生','若','只','如','初','見']
gen=iter(alist)
for i in alist:
print(next(gen))
出力:
人
生
若
只
如
初
見
for i in alist:
print(i)
出力:
人
生
若
只
如
初
見
反復可能オブジェクトとイテレータオブジェクト
- 反復可能オブジェクトは全体を指し、例えばリストのようなものです。
- イテレータオブジェクトはiter()関数によって返されるオブジェクトで、このオブジェクトに対してnext()関数を使用して要素を次々と取得できます。
generator
ジェネレータは、イテレータのようにforループを使用して要素を取得できる関数です。
ジェネレータの作成
リスト内包表記
alist=[i for i in range(5)]
print(alist)
出力:
[0,1,2,3,4]
'''
[]を使用してリストオブジェクトを作成
'''
alist=(i for i in range(5))
print(alist)
出力:
0
'''
この場合、alistはジェネレータオブジェクト
'''
yield
yieldとrenturnの違い
- 関数がyieldに到達すると、関数の実行は一時停止し、yieldの後の値が返されます。
- yieldに何も値が続いていない場合、Noneが返されます。
- yieldは値を返しますが、関数は終了しません。この関数を割り当てた識別子を再度呼び出すと、関数は実行を継続します。
def generator():
top=5
i=0
while i<top:
print('現在の値:'+str(i))
i+=1
yield i
raise StopIteration
gen=generator()
for i in range(6):
print(next(gen))

いつまた一杯の酒を飲み、細かい論文を議論するのか。