前回の記事「手をつないでPythonを学ぶ」22-辞書では、辞書の基本概念、追加、削除、変更、チェック、辞書関数、およびいくつかのより重要な方法を学びました。この記事では、最初にPythonに組み込まれているシーケンス関数をいくつか紹介し、次に辞書の例をいくつか紹介して、プログラミングにおける辞書の特性と適用方法をよりよく理解できるようにします。
1.sorted()関数
sort()の関数は、要素を任意の順序で正の順序でソートし、出力用のソート済みリストを作成することです。関数のパラメータは任意のシーケンスです。ソート時に、トラバースできる最小単位に従って分割され、ソートされます。以前にリストを調べたとき、これに似たlist.sort()メソッドがありました。
In [1]: sorted("《手把手陪您学Python》") # 字符串排序的输出结果,是由每个字符排序后作为元素的列表
Out[1]: ['P', 'h', 'n', 'o', 't', 'y', '《', '》', '学', '您', '手', '手', '把', '陪']
In [2]: sorted((8, 5, 1))
Out[2]: [1, 5, 8]
In [3]: sorted((8, 5, (1, 2))) # 参数中要排序的元素必须只能是一种数据类型,否则会报错
Out[3]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-d3c8864d6278> in <module>
----> 1 sorted((8, 5, (1, 2))) # 参数中要排序的元素必须只能是一种数据类型,否则会报错
TypeError: '<' not supported between instances of 'tuple' and 'int'
In [4]: sorted(((8, 5), (1, 2))) # 可以都是元组或者列表
Out[4]: [(1, 2), (8, 5)]
In [5]: sorted({3:'A', 2:'B', 1:'C'}) # 字典按照键进行排序,输出时也只输出键排序后的列表
Out[5]: [1, 2, 3]
In [6]: sorted(123) # 数字不能排序,因为数字不能被遍历
Out[6]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-2b4e23a052ca> in <module>
----> 1 sorted(123) # 单个数字不能排序,因为数字不能被遍历
TypeError: 'int' object is not iterable
2. reverse()関数
reverse()の機能は、シーケンスの要素を逆の順序で配置することです。ただし、sorted()関数との違いは、正の順序と逆の順序だけだとは思わないでください。実際、ここには大きな違いがあります。
1つは、sorted()関数がシーケンス内の要素をASCIIの順序で正の順序で並べ替えるのに対し、reversed()関数はシーケンス内の要素をASCIIの順序で並べ替えず、元のシーケンスを逆の順序で直接配置することです。誤解しやすく、例を見れば理解できます。
In [7]: print(sorted("《手把手陪您学Python》")) # 整体重排序
print(list(reversed("《手把手陪您学Python》"))) # 将原来的顺序倒过来
Out[7]: ['P', 'h', 'n', 'o', 't', 'y', '《', '》', '学', '您', '手', '手', '把', '陪']
['》', 'n', 'o', 'h', 't', 'y', 'P', '学', '您', '陪', '手', '把', '手', '《']
2つ目は、sorted()関数がシーケンスを並べ替えてリストの形式で出力できるのに対し、reversed()関数はイテレータのみを生成することです。reversed()の結果を直接出力すると、エラーが報告されます。 (正確にはエラーではないので、ここに書いてください。理解しやすくなります)、list()関数を使用してリストに変換する必要があります(上記の例のように)。reverse()関数のこの機能を使用すると、forループのイテレーターとして直接使用できます。
In [8]: reversed("《手把手陪您学Python》") # 直接输出会报错
Out[8]: <reversed at 0x1c6f3f12898>
In [9]: for str in reversed("《手把手陪您学Python》"): # 可以作为for循环的迭代器
print(str, end=' ') # 注意print()函数的参数
Out[9]: 》 n o h t y P 学 您 陪 手 把 手 《
3. Enumerate()関数
シーケンスをトラバースするとき、シーケンス内のすべての要素をトラバースするだけでなく、シーケンス内の各要素の位置を同時に記録する必要がある場合もあります。学んだことを使用して、次のようなコードを記述できます。
In [10]: lst = ['A', 'B', 'C', 'D', 'E', 'F']
i = 0
for value in lst:
i += 1 # 还记得这个符号吧
print("序列中,第{}个元素是{}".format(i, value))
Out[10]: 序列中,第1个元素是A
序列中,第2个元素是B
序列中,第3个元素是C
序列中,第4个元素是D
序列中,第5个元素是E
序列中,第6个元素是F
この状況は非常に一般的であるため、Pythonには、シーケンスの要素と位置を直接取得するための組み込みのenumerate()関数があります。戻り値の結果は(i、value)のタプルです。ここで、valueは要素の値であり、iは要素の位置インデックスです。出力結果では、iとvalueの順序は不変であることに注意してください。変数に名前を付けるときは特に注意してください。
enumerate()関数を使用すると、前の例を次のコードと省略できます。
In [11]: lst = ['A', 'B', 'C', 'D', 'E', 'F']
for i, value in enumerate(lst): # 变量名即使颠倒,元素的索引也会赋值给前面的变量,元素值也会赋值给后面的变量
print("序列中,第{}个元素是{}".format(i, value))
Out[11]: 序列中,第1个元素是A
序列中,第2个元素是B
序列中,第3个元素是C
序列中,第4个元素是D
序列中,第5个元素是E
序列中,第6个元素是F
これを見ると、enumerate()関数の関数が実際にはバイナリタプルを出力することであり、このバイナリタプルはたまたま辞書のキーと値のペアに非常に似ていることがわかります。したがって、enumerate()関数を使用してディクショナリを構築し、インデックス値と要素値をディクショナリにマップできます。
In [12]: lst = ['A', 'B', 'C', 'D', 'E', 'F'] # 构造序列
dict0 = {} # 定义空字典,必须要定义,否则报错
for i, value in enumerate(lst):
dict0[i] = value
dict0
Out[12]: {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F'}
上記は、シーケンスインデックス値をディクショナリキーとして使用し、要素値をディクショナリ値として使用する例です。要素値を辞書キーとして使用し、シーケンスインデックス値を辞書値として使用する方法を見つけることができます。
4. zip()関数
zip()関数の関数は、リスト、タプル、またはその他のシーケンスの要素をインデックスの順序に従ってペアにし、タプルのリストを生成することです。一致するシーケンスはさまざまなタイプにすることができます。シーケンスの長さが異なる場合、最終的な出力リストの長さは最短のシーケンスによって決定されます。
In [13]: seq1 = ['A', 'B', 'C', 'D', 'E'] # 列表元素为字符串
seq2 = (1, 2, 3, 4, 5, 6) # 元组元素为数字,有6个元素,但输出结果以最短的5个元素为准
seq3 = [(1, 2), (1, 2) , (1, 2), (1, 2), (1, 2)] # 列表元素为元组
seq4 = (1, [1, 2], 'W', (1, 2), True) # 元组包括多种元素类型
zipped1 = zip(seq1, seq2, seq3, seq4) # 序列类型和序列内的元素类型都可以不同
list(zipped1) # 转换成列表显示
Out[13]: [('A', 1, (1, 2), 1),
('B', 2, (1, 2), [1, 2]),
('C', 3, (1, 2), 'W'),
('D', 4, (1, 2), (1, 2)),
('E', 5, (1, 2), True)]
In [14]: seq5 = ['A', 'B', 'C', 'D', 'E'] # 列表
seq6 = (1:11, 2:22, 3:33, 4:44, 5:55) # 字典
zipped2 = zip(seq5, seq6) # 字典不能和其它配对,字典间也不能配对
list(zipped2)
Out[14]: File "<ipython-input-25-6db62aa22811>", line 2
seq6 = (1:11, 2:22, 3:33, 4:44, 5:55) # 字典
^
SyntaxError: invalid syntax
zip()関数の一般的なシナリオは、複数のシーケンスを同時にトラバースすることであり、enumerate()関数で使用されることもあります。
In [15]: for i, (a, b, c, d) in enumerate(zip(seq1, seq2, seq3, seq4)):
print("{0} : {1}, {2}, {3}, {4}".format(i, a, b, c, d)) # 格式化输出的方式,大家还记得吧
Out[15]: 0 : A, 1, (1, 2), 1
1 : B, 2, (1, 2), [1, 2]
2 : C, 3, (1, 2), W
3 : D, 4, (1, 2), (1, 2)
4 : E, 5, (1, 2), True
「ペアリング」シーケンスに加えて、zip()関数は「ペアリング」と同様のシーケンスをインテリジェントに「分割」することもできます。この「ペアリング」シーケンスは必ずしもリストではなく、タプルやその他のシーケンスにすることもできます。使用される関数は引き続きzip()関数ですが、zip(*)になるには、パラメーターの前に*記号を追加する必要があります。zipの逆のプロセス、または「解凍」プロセスとして理解できます。
In [16]: seq1, seq2, seq3, seq4 = zip(*zip(seq1, seq2, seq3, seq4)) # 利用“解压”过程,可以将配对后的序列再进行还原
print('seq1: ', seq1, '\nseq2: ', seq2,'\nseq3: ', seq3,'\nseq4: ', seq4)
Out[16]: seq1: ('A', 'B', 'C', 'D', 'E')
seq2: (1, 2, 3, 4, 5)
seq3: ((1, 2), (1, 2), (1, 2), (1, 2), (1, 2))
seq4: (1, [1, 2], 'W', (1, 2), True)
In [17]: seq = [(1, 'A'), (2, 'B'), (3, 'C')] # 换个列子能看清楚一些,相当于把行的列表,变成列的列表
a, b = zip(*seq)
print(a, '\n', b)
Out[17]: (1, 2, 3)
('A', 'B', 'C')
2つの例を通して、zip(*)の機能をすでに理解していますか?zip()の機能は、複数のシーケンスの同じ位置にある要素をタプルにマージしてから、それらをリストにマージすることです。zip(*)の機能は、リスト内の各タプルの同じ位置にある要素を複数のタプルに結合することです。(説明は少しあいまいです、比較のために例を見ることができます)
5.シーケンスから辞書を生成します
シーケンスが2つある場合は、zip()関数を使用して、辞書内の要素の位置に応じてこれら2つのシーケンスをペアにすることができます(一方のシーケンスがキーを提供し、もう一方のシーケンスが値を提供します)。 :
In [18]: key_list = (1, 2, 3)
value_list = ('A', 'B', 'C')
dict1 = {}
for key, value in zip(key_list, value_list):
dict1[key] = value
dict1
Out[18]: {1: 'A', 2: 'B', 3: 'C'}
ディクショナリは基本的に2タプル(2タプルを含むタプル)のコレクションであるため、ディクショナリは2タプルのリストをパラメータとして受け入れることができます。したがって、zip()の後にリスト内のforループを使用する必要はありません。 、および辞書を直接生成します。
In [19]: key_list = (1, 2, 3)
value_list = ('A', 'B', 'C')
dict2 = dict(zip(key_list, value_list))
dict2
Out[19]: {1: 'A', 2: 'B', 3: 'C'}
上記は、Pythonの4つの組み込みシーケンス関数の概要です。一部の辞書アプリケーションもその中に散在しており、前の記事で紹介した辞書を補足しています。
次の記事では、Pythonのデータ構造について引き続き学習します。ここで紹介するのはコレクションです。これは、この段階で学習する最後のデータ構造でもありますので、しばらくお待ちください。
この記事を読んでくれてありがとう!ご不明な点がございましたら、メッセージを残してご相談ください^ _ ^
「手をつないでPythonを学ぶ」シリーズの他の記事を読むには、公式アカウントに従ってメニュー選択をクリックするか、以下のリンクをクリックして直接アクセスしてください。
「手をつないでPythonを学ぶ」1-なぜPythonを学ぶのか?
「手をつないでPythonを学ぶ」2-Pythonのインストール
「手をつないでPythonを学ぶ」3-PyCharmのインストールと構成
「手をつないでPythonを学ぶ」4-HelloWorld!
「手をつないでPythonを学ぶ」5-JupyterNotebook
「手をつないでPythonを学ぶ」11-文字列のフォーマットされた出力
「手をつないでPythonを学ぶ」14-インタラクティブな入力
ファンの方へ:「Pythonも言った」パブリックアカウントをフォローし、「Hand 23」と返信すると、この記事で使用されているサンプル文を無料でダウンロードできます。