Python 辞書とコレクション プログラミングのヒント

こんにちは、Token_w のブログです。ようこそお越しくださいました。
今日は主に、実際のプログラミングにおける Python の辞書とセットの使用スキルについて説明します。
なかなか整理しにくい内容ですが、参考になります。よろしくお願いします。ありがたい!

目次

1. リスト、辞書、コレクションの条件に従ってデータをフィルタリングするにはどうすればよいですか?

実際のケース

  • ケース 1: リスト内の負の数値をフィルターで除外する [3、9、-1、10、20、-2、…]
  • ケース 2: 辞書内の値が 90 より大きい項目をフィルターで除外する {'lisi': 79, 'Jin': 88, 'lucy': 93, … }
  • ケース 3: 3 で割り切れるセット {77, 89, 34, 20, 21...} 内の要素をふるい落とすのは比較的簡単です。通常の方法は、リスト、辞書、セット内の各項目を反復することです
    。順番に状態判定を行います。

しかし、Python には、この種の問題を解決するためのより高度な方法があり、よりシンプルで効率的です。

01 ケース 1: リスト内の負の数値をフィルターで除外する [3、9、-1、10、20、-2、…]

方法 1: フィルター機能を使用する

from random import randint

# 使用列表解析生成 -10~10 之间的10个元素
data = [randint(-10, 10) for _ in range(10)]

print('原始列表为:' , data)

# filter(function or None, iterable) --> filter object
data_o = filter(lambda x: x >= 0, data)

for each in data_o:
    
    print(each)

方法 2: リスト内包表記を使用する

from random import randint

# 使用列表解析生成 -10~10 之间的10个元素
data = [randint(-10, 10) for _ in range(10)]

print('原始列表为:',  data)

data_o = [x for x in data if x >= 0]

print(data_o)

02 ケース 2: 辞書の値が 90 を超える項目を除外する {'lisi': 79, 'Jin': 88, 'lucy': 93, … }

from random import randint

# 使用字典解析生成 一个字典
d ={
    
    x: randint(60, 100) for x in range(1, 10)}
print(d)

d_o = {
    
    k: v for k, v in d.items() if v >= 90}

print(d_o)

03 ケース 3: 集合 {77, 89, 34, 20, 21...} 内の 3 で割り切れる要素をふるいにかけます。

from random import randint

# 使用集合解析生成 -10~10 之间的10个元素
data = {
    
    randint(-10, 10) for _ in range(10)}

print('原始集合为:', data)

data_o = {
    
    x for x in data if x % 3 == 0}

print(data_o)

2. プログラムの読みやすさを向上させるためにタプル内の各要素に名前を付けるにはどうすればよいですか?

stuents = ('Jim', 16, 'male', '[email protected]')
name=stuents[0]
age=stuents[1]
sex= stuents[2]
email=stuents[3]
print(name, age, sex, email)

01 方法 1: 他の言語と同様に列挙型を定義します。つまり、一連の数値定数を定義します。

s=stuents = ('Jim', 16, 'male', '[email protected]')
NAME, AGE, SEX, EMAIL = range(4)
name=s[NAME]
age=s[AGE]
sex= s[SEX]
email=s[EMAIL]
print(name, age, sex, email)

02 方法 2: 標準ライブラリの collections.namedtuple を使用して組み込みタプルを置き換える

from collections import namedtuple
Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
s = Student('Jim', 16, 'male', '[email protected]')
print(s)
# Student(name='Jim', age=16, sex='male', email='[email protected]')

print(s.name)
# 'Jim'

print(s.age)
# 16

print(s.sex)
# 'male'

print(s.email)
# '[email protected]'

3. シーケンス内の要素の出現頻度をカウントするにはどうすればよいですか?

ケース 1:

方法 1: 従来の方法

from random import randint

# 随机生成一个列表
data = [randint(0, 20) for _ in range(30)]

# 以列表中的值为字典的键,0为字典的值建立字典
c = dict.fromkeys(data, 0)

# 依次遍历列表,遇到一个元素,就把字典中对应的键的值加1
for x in data:

    c[x] += 1

print(c)

方法 2: collections.Counter オブジェクトを使用する

シーケンスを Counter のコンストラクターに渡し、要素頻度の辞書として Counter オブジェクトを取得します。
Counter.most_common(n) メソッドは、頻度が最も高い n 個の要素のリストを取得します。

from random import randint
from collections import Counter

# 随机生成一个列表
data = [randint(0, 20) for _ in range(30)]

c = Counter(data)

# 得到的 c 就是一个collections.Counter类型的数据,和方法 一 结果一样
# 用法与字典一样,例如 c[2] , 就是得到 键为2 对应的值
print(c)

# 另外,还可以使用 most_common() 方法得到 出现频率最高的几个键和值
print(c.most_common(3))  # 输出前3名

ケース 2:

from collections import Counter
import re

with open('./test.txt', 'r') as f:
    txt = f.read()

# 使用 正则表达式 对文本进行切割,按照 非字母字符 进行切割
l1 = re.split('\W+', txt)

c = Counter(l1)

# 得到频率最高的10个单词
print(c.most_common(10))

4. 辞書内の値のサイズに応じて辞書内の項目を並べ替えるにはどうすればよいですか?

01 方法 1: zip を使用して辞書データをタプルに変換する

from random import randint

# 生成随机字典
d = {
    
    x:randint(60,100) for x in 'xyzabc'}

print(d)

# 把值放在前面,键放在后面,构成元组,每个元组为列表的一个项
# 得到的结果为 [(74, 'z'), (80, 'y')...]形式
list1 = zip(d.values(), d.keys())

# 然后对得到的列表进行排序,就会以列表中的元组的第一项排序,相同时再比较第二项

print(sorted(list1))

02 方法 2:sorted 関数の key パラメーターを使用する

from random import randint

# 生成随机字典
d = {
    
    x:randint(60,100) for x in 'xyzabc'}

print(d)

# d.items() 也是一个元组的列表,只是元组中键在前,值在后
# 使用 key 参数设置以第二项 (值)作为排序依据

print(sorted(d.items(), key = lambda x: x[1]))

5. 複数の辞書で共通のキーをすばやく見つけるにはどうすればよいですか?

01 方法 1: 伝統的な方法、順番にトラバース

from random import randint, sample

# 随机产生 3 场球赛的 进球人和数
s1 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
s2 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
s3 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

print(s1)
print(s2)
print(s3)


# 传统方法
res = []

for k in s1:
    if k in s2 and k in s3:
        res.append(k)
       
print(res)

02 方法2:集合(集合)の積演算を利用する

辞書のkeys()メソッドを使用して、辞書のキーのセットを取得します。
すべての辞書のキーのセットの共通部分を取得します。

from random import randint, sample

# 随机产生 3 场球赛的 进球人和数
s1 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
s2 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
s3 = {
    
    x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

print(s1)
print(s2)
print(s3)


print(s1.keys() & s2.keys() & s3.keys())

6. 辞書を整理整頓するにはどうすればよいですか?

d = dict()

d['Jim']=(1.35)

d['Leo']=(2,37)

d['Bob']=(3,45)

for k in d:
    print(k)

メソッド: collections.OrderedDict を使用します。

辞書 Dict を OrderedDict に置き換え、プレーヤーのスコアを OrderedDict に順番に保存します。


from collections import OrderedDict

d = OrderedDict()

d['Jim']=(1.35)

d['Leo']=(2,37)

d['Bob']=(3,45)

for k in d:
    print(k)

7. ユーザーの履歴記録機能を実装するにはどうすればよいですか?

元のコードは次のとおりです。

from random import randint

N = randint(0, 100)

def guess(k):
	if k == N:
		print('猜对了')
		return True
	elif k < N:
		print('猜小了')
	else:
		print('猜大了')
	return False

while True:
	line = input("please input a number:")
	if line.isdigit():
		k = int(line)
		if guess(k):
			break

最後の 5 つの推測を保存したいのですが、以前の推測は削除されます

解決:

履歴を保存するには、容量 n (この例では n=5) のキューを使用します
。 標準ライブラリの両端循環キューである deque を使用します。

from random import randint
from collections import deque

history = deque([], 5)

N = randint(0, 100)

def guess(k):
	if k == N:
		print('猜对了')
		return True
	elif k < N:
		print('猜小了')
	else:
		print('猜大了')
	return False

while True:
	line = input("please input a number:")
	if line.isdigit():
		k = int(line)
		history.append(k)
		if guess(k):
			break
	elif line == 'history' or line == 'h?':
		print(history)

次回プログラムを実行するときに以前の履歴も表示したい場合は、キュー オブジェクトをディスクに保存する必要があり、pickle を使用できます。

pickle は、あらゆる種類のデータ (数値、リスト、辞書、文字列など) をディスク ファイルに保存し、必要に応じて元のデータとして読み戻すことができます。

解決策: プログラムを終了する前に、pickle を使用してキュー オブジェクトをファイルに保存し、プログラムを再度実行するときにインポートできます。

ピクルスの使い方:

データの書き込み:

import pickle

data = [1, 2, 3, 4]

with open('data.dat', 'wb') as f:

    pickle.dump(data, f)

データの読み取り:

import pickle

with open('data.dat', 'rb') as f:

    data = pickle.load(f)

print(data)

要約する

今日は、いくつかの基本的なコード例を参考に、実際のプログラミングで Python の辞書とセットを使用する方法のヒントを共有します。

おすすめ

転載: blog.csdn.net/weixin_61587867/article/details/132270140