1

JSONまたはJSON linesの形式のデータから始めて、構造パターン マッチングを使用してそれに対してクエリを実行したいと考えています。

たとえば、 json.load() を実行した後、次のような構造の dict を取得します。

publications = {
    'location': 'central library',
    'items': [
        {'kind': 'book', 'title': 'Python in Aviation'},
        {'kind': 'magazine', 'title': 'Flying Monthly', 'issues': 15},
        {'kind': 'book', 'title': 'Python for Rock Climbers'},
        {'kind': 'magazine', 'title': 'Weekly Climber', 'issues': 42},        
    ]
}

私がやりたいことは、Python 3.10 の構造パターン マッチングを適用して、関連データを抽出することですこれは、次の SQL クエリの場合と同じです。

SELECT title, issues FROM Publications WHERE kind = "magazine";
4

1 に答える 1

1

マッピング パターン

解決の鍵は、マッピング パターンを適用することです。PEP 634 によると、それらの形式は次のとおりです。

mapping_pattern: '{' [items_pattern] '}'
items_pattern: ','.key_value_pattern+ ','?
key_value_pattern:
    | (literal_pattern | value_pattern) ':' pattern
    | double_star_pattern
double_star_pattern: '**' capture_pattern

日常の言葉で言えば、これは「照合したい値の定数を入れ、抽出したいフィールドの変数を入れた中括弧で辞書を書く」ことを意味します。

練り上げた例

質問で提供されたデータを使用して、要求された SQL クエリをどのように変換するかを次に示します。

for item in publications['items']:
    match item:
        case {'kind': 'magazine', 'title': title, 'issues': issues}:
            print(f'{title} has {issues} issues on hand')

これにより、雑誌のみが含まれるようにアイテムがフィルタリングされます。次に、タイトル問題のフィールドを抽出します。これは以下を出力します:

Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand
于 2021-05-13T20:07:24.247 に答える