Pythonでスター式を使用して解凍する方法は?
はじめに
解凍の基本的な制限の1つは、解凍するシーケンスの長さを事前に知っておく必要があることです。
その方法..
random_numbers = [0, 1, 5, 9, 17, 12, 7, 10, 3, 2] random_numbers_descending = sorted(random_numbers, reverse=True) print(f"Output \n*** {random_numbers_descending}")
出力
*** [17, 12, 10, 9, 7, 5, 3, 2, 1, 0]
数値から最大値と2番目に大きい値を見つけたい場合は、「解凍するには値が多すぎます」という例外が発生します。
print(f"Output \n*** Getting the largest and second largest") largest, second_largest = random_numbers_descending
出力
*** Getting the largest and second largest
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 1 print(f"Output \n*** Getting the largest and second largest") ----> 2 largest, second_largest = random_numbers_descending ValueError: too many values to unpack (expected 2)
Pythonは、多くの場合、インデックス作成とスライスに依存しています。たとえば、以下の項目のリストから最大、2番目に大きいものを抽出したい場合、その方法は次のとおりです。
largest = random_numbers_descending[0] print(f"Output \n*** Getting the largest - {largest}")
出力
*** Getting the largest - 17
second_largest = random_numbers_descending[1] print(f"Output \n*** Getting the second largest - {second_largest}")
出力
*** Getting the second largest - 12
rest_of_numbers = random_numbers_descending[2:] print(f"Output \n*** Getting the rest of numbers - {rest_of_numbers}")
出力
*** Getting the rest of numbers - [10, 9, 7, 5, 3, 2, 1, 0]
これは機能しますが、インデックス作成とスライスはすべて視覚的にノイズが多くなります。実際には、この方法でシーケンスのメンバーをさまざまなサブセットに分割するとエラーが発生しやすくなります。
それをより良くするために、Pythonはスター付き式によるキャッチオールアンパックをサポートしています。
このスター付きの構文により、解凍割り当ての一部が、解凍パターンの他の部分と一致しないすべての値を受け取ることができます。
largest,second_largest, *rest_of_numbers = random_numbers_descending print(f"Output \n largest: {largest} \n second_largest:{second_largest} \n rest_of_numbers:{rest_of_numbers}")
出力
largest: 17 second_largest:12 rest_of_numbers:[10, 9, 7, 5, 3, 2, 1, 0]
上記のコードはどのように見えますか?読みやすい1行で、出力を達成できます。スター付きの式はどの位置にも表示される可能性があるため、1つのスライスを抽出する必要があるときはいつでも、キャッチオールアンパックのメリットを享受できます
largest: 17 rest_of_numbers:[12, 10, 9, 7, 5, 3, 2, 1] smallest:0
*rest_of_numbers, second_smallest, smallest = random_numbers_descending print(f"Output \n rest_of_numbers:{rest_of_numbers} \n second_smallest: {second_smallest} \n smallest:{smallest}")
rest_of_numbers:[17, 12, 10, 9, 7, 5, 3, 2] second_smallest: 1 smallest:0
ただし、スター付きの式を含む割り当てを解凍するには、少なくとも1つの必須部分が必要です。そうでない場合、SyntaxErrorが発生します。キャッチオール式を単独で使用することはできません。
*rest_of_numbers = random_numbers_descending
File "", line 1 *rest_of_numbers = random_numbers_descending ^ SyntaxError: starred assignment target must be in a list or tuple
また、単一レベルの解凍パターンで複数のキャッチオール式を使用することはできません。これは考慮すべきもう1つの重要な注意事項です。
*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
File "", line 1 *rest_of_numbers, *more_smallest, smallest = random_numbers_descending ^ SyntaxError: two starred expressions in assignment
ただし、アンパックされるマルチレベル構造のさまざまな部分のキャッチオールである限り、アンパックする代入ステートメントで複数のスター付き式を使用することは可能です。
player_grandslame_and_atptitles = { 'Federer': (20, 103), 'Nadal': (20,84),} ((player1, (grandslam1, *atptitles1)), (player2, (grandslam2, *atptitles2))) = player_grandslame_and_atptitles.items() print(f'Output \nPlayer - {player1} Have acheived {grandslam1} grandslams and , {atptitles1} atp tour titles') print(f'Player - {player2} Have acheived {grandslam2} grandslams and , {atptitles2} atp tour titles')
出力
Player - Federer Have acheived 20 grandslams and , [103] atp tour titles Player - Nadal Have acheived 20 grandslams and , [84] atp tour titles
スター付きの式は、すべての場合でリストインスタンスになります。解凍されるシーケンスからの残りのアイテムがない場合、キャッチオール部分は空のリストになります。これは、事前に少なくともN個の要素があることがわかっているシーケンスを処理する場合に特に便利です。
random_numbers = [0, 1] first, second, *rest = random_numbers print(f"Output \n{first, second, rest}")
出力
(0, 1, [])
-
正規表現を使用してPythonで数字のみを照合するにはどうすればよいですか?
次のコードは、Python正規表現を使用して、指定された文字列の数字のみに一致します。 例 import re m = re.search(r'\d+', '5Need47forSpeed 2') print m 出力 <_sre.SRE_Match object at 0x0000000004B46648> 例 次のコードは、指定された文字列内のすべての数字を検索し、それらをリストとして出力します import re m = re.findall(r'\d', '5Need47forSpeed 2') print m
-
Pythonを使用してファイルを削除するにはどうすればよいですか?
osモジュールの関数を含む単一のファイルまたは単一の空のフォルダーを削除できます。たとえば、ファイルmy_file.txtを削除する場合は、 >>> import os >>> os.remove('my_file.txt') os.removeの引数は、絶対パスまたは相対パスである必要があります。