Python を使用してアルゴリズムの問題を実行する際の注意事項/コツ (随時更新)

前に書いたのは、C++を使わなければいけないと思ったので、簡単なC++の知識を前に記録しました。後は基本的にPythonを使ってアルゴリズムの問​​題を書くので、Pythonを記録しました。詳細はカタログを参照してください。

Python の形式は出力時に 0 を埋めたり、未知数を埋めたりすることができます。

<fill to the right,> fill to the left
Python の形式
ここに画像の説明を挿入

Pythonはbaseの変換を直接実現できる

int('数值',进制)、指定された基数の値を 10 進整数に変換します。
hex(10进制数)、10 進数を 16 進数に変換します。
oct(10进制数), 10進数を8進数に変換します。
bin(10进制数), 10進数を2進数に変換します。

print("{:d}".format(int('0xAA',16)))
print("{:s}".format(hex(10)))
print("{:s}".format(oct(10)))
print("{:s}".format(bin(10)))

Python は辞書とリストの特別な並べ替えを実装します

sortedソートは任意のイテレータに対して実装できます
key。これは接続関数であり、この関数は処理のためにイテレータの各要素を受け取るために使用されます。ここでlambda匿名関数を使用する目的key=lambda x:x[0]は、x を受け取り、インデックスである x[0] を返すことです。そのため、ここではインデックスに従ってソートされています。
反復的なキーと値のペアを使用するとdict.items()、dict の直接反復ではインデックスのみを反復できることに注意してください。

#dic为一个字典,返回值是一个列表,列表中的元素都是元组,也就是键值对。
dic = sorted(dic.items(),key=lambda x:x[0],reverse=False)
#这里则是根据列表中
lst = sorted(lst.items(),key=lambda x:x[2],reverse=False)

リストのソートについても同様です。
ここでは、各リストに 3 つの要素があると仮定し、要素の合計サイズに従ってソートする必要があります。リストに付属の
関数を使用する場合はsort、リストは直接ソートされ、値は返されません。

lst.sort(key=lambda x:sum(x))
#使用sorted也是可以的
lst = sorted(lst,key=lambda x:sum(x))

Python はシーケンスに逆インデックスを実装します

スライス操作を使用するだけです

s='123dz'
s= s[::-1]

Python は文字列、リスト、辞書間の変換を実装します


次を使用して、文字列の各文字をリスト内の要素に分割します。list(str)

s='asd'
list(s)
#输出:['a', 's', 'd']

特殊文字を区切り文字として
使用して、文字列をリストの要素に分割します。str.split()

s='das xcz nmb'
s.split(' ')
#输出:['das', 'xcz', 'nmb']

リスト内の要素を文字列に変換します。途中に追加する必要があるスペーサーとして char を
使用します(注: この方法では、入力が次の場合、受信データの各要素の間にスペーサーを追加し、それを文字列に変換します) string の場合、各文字の間に区切り文字が追加されます)'char'.join()

l =['das', 'xcz', 'nmb']
' '.join(l)
#输出:'das xcz nmb'

#对字符串使用
s='das xcz nmb'
' '.join(s)
#输出:'d a s   x c z   n m b'

リストを辞書に変換する を
使用dict([装有两个元素的数据,装有两个元素的数据,...])してリストを渡します。リスト内の各要素は 2 つの要素の値であり、キーと値のペアとして使用されます。

l =[(1,'a'),'2b',[3,'c']]
dict(l)
#输出:{
    
    1: 'a', '2': 'b', 3: 'c'}

#可以直接压缩的方式将两个列表转化为字典
l1 = [1,2,3]
l2 = ['a','b','c']
dict(zip(l1,l2))
#输出:{
    
    1: 'a', 2: 'b', 3: 'c'}

Python は再帰 (再帰) の最大深さを変更します

Python では再帰アルゴリズムの最大深度が約 1000 回に制限されていますが、アルゴリズムがこの制限を超える場合があり、次の構文が使用されることがあります。

import sys
sys.setrecursionlimit(100000000)

Pythonのヒープモジュール - heapq

詳細については、次の 2 つのブログを参照してください:
Python heapq ライブラリの使い方入門
python Advanced (heap heapq module

L = [1,2,3]
print(L)
heapify(L)  #堆区的是树结构,父节点小于叶子节点
print(L)
heappop(L)
print(L)
heappush(L,1)
print(L)

目的:データ量が多い場合、ヒープ領域を使用することでヒープ領域から最小値を抽出し、高速にデータを載せることができます。


Python の Counter 関数 - リスト内のすべての要素の出現数を数えて並べ替えます。

from collections import Counter
nums=[5,5,5,2,2,2,3,3,3,4]
L = Counter(nums)
print("根据次数排序:",L)
print("根据次数排序:",L.most_common()) #转化为列表,每个列表元素都是(,次数)
print("返回出现次数最多的2个值:",L.most_common(2))  #返回的是列表
print("返回出现次数最少的值:",L.most_common()[-1]) #查看次数出现最少的值组成的元组,相当于从列表中取元素
'''
输出
根据次数排序: Counter({
    
    5: 3, 2: 3, 3: 3, 4: 1})
根据次数排序: [(5, 3), (2, 3), (3, 3), (4, 1)]
返回出现次数最多的2个值: [(5, 3), (2, 3)]
返回出现次数最少的值: (4, 1)
'''

Python のフィルター関数 - 修飾されていない要素をフィルターで除外し、適格な要素で構成される新しいリストを返します。

w=['dasdasd','dasd','das','1563132132']
print(list(filter(lambda x: len(x) < 5, w)))
def fun(a):
    return (1 if len(a)<5 else 0)
print(list(filter(fun, w)))
'''
输出
['dasd', 'das']
['dasd', 'das']

Python では * と ** を使用して解凍できます。

Pythonの*と**を徹底解説
同時に、zip()演算子と*演算子を連携させて解凍できるよく使われる関数もあります。

x1 = [1, 2, 3]
x2 = ['a', 'b', 'c']
zipped = zip(x1,x2)
zipped = list(zipped)
print(zipped)
a,b = zip(*zipped)
print(a,b)
输出:
[(1, 'a'), (2, 'b'), (3, 'c')]
(1, 2, 3) ('a', 'b', 'c')

その原理は実は zip の原理で、まず zip とは、入力された複数のイテレータ (この例では 2 つのリスト) からインデックスに従って対応するインデックス要素を取り出してタプルを形成し、複数のタプルを形成することです。
次に、いわゆる「解凍」では、*zippedこれら 3 つのイテレータ (タプル) を zip 関数に渡し、インデックスに従って 3 つのタプル内の対応する要素を取り出すだけでOKです。(zipped はリストであり、1 つの反復子に相当するため、zipped を直接渡すことはできないことに注意してください)。
このアイデアは、次のコードでさらに検証できます。

#上面代码忽略不加了
a,b,c = zipped
print(list(zip(a,b,c)))
输出:
[(1, 2, 3), ('a', 'b', 'c')]

Python は @staticmethod と @classmethod を使用して、クラスを初期化せずに関数を直接呼び出します。

@staticmethodおよび@classmethod
@staticmethod: 関数を静的関数にします。パラメーターを渡すことは必須ではなく、クラスのメンバーを呼び出すことはできません。
@classmethod: 関数をインスタンス化する必要はなく、self パラメーターも必要ありませんが、最初のパラメーターは独自のクラスを表す cls パラメーターである必要があります。これは、クラスのプロパティ、メソッドの呼び出しに使用できます。クラス、インスタンス化されたオブジェクトなど ( cls().member )。

class C(object):
    @staticmethod
    def f():
        print('runoob');
 
C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()  

class A(object):
    bar = 1
    def func1(self):
        print('foo')
    @classmethod
    def func2(cls):
        print('func2')
        print(cls.bar)  #直接调用成员
        cls().func1()  # 调用 foo 方法
A.func2()

Pythonの順列

Pythonの順列

おすすめ

転載: blog.csdn.net/qq_49030008/article/details/123873570