名前付きPython文字列フォーマットで使用可能な変数を見つける[重複]

Dec 13 2020

テンプレート/フォーマット文字列が与えられた"{foo}_{bar}"場合、必要なフォーマットキーをプログラムで抽出するにはどうすればよい["foo", "bar"]ですか?

私はさまざまな実験のためのパラメータの口述を持っています

[
    {"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]

ご覧のとおり、2番目のパラメータセットにはキーがありませんbaz。だから私が何かをするとき

"{biz}_{baz}".format(**parameters)bazがないため、KeyErrorが発生します。

私はすべて交換したい不足しているとのparmatersをNR、そしてそれらの値で使用可能なすべてのパラメータを入力します。

その場合、出力は次のようになります。

[
    {"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]

コンテキストの場合:100以上の文字列があり、その文字列に必要な予想されるパラメーター間に一貫性がありません。

回答

2 BramVanroy Dec 13 2020 at 21:51

文字列から必要なパラメータ名を効率的に収集し、実際のキー間のセットの類似性をチェックすることで、欠落しているキーがないかどうかをチェックできます。不足しているキーがある場合は、値「NR」を追加します。最後に、を使用.formatして文字列を「フォーマット済み」キーに正しくフォーマットします。

ds = [
    {"parameters": {"foo": 1, "bar": 2}, "format": "{foo}_{bar}"},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]

for d in ds:
    # Copy params so that we do not change params in-place
    params = d["parameters"]
    req_keys = set(d["format"][1:-1].split("}_{"))
    missing_keys = req_keys.difference(params.keys())

    if len(missing_keys) > 0:
        params = {**params, **{key: "NR" for key in missing_keys}}

    d["formatted"] = d["format"].format(**params)

print(ds)

# [{'parameters': {'foo': 1, 'bar': 2}, 'format': '{foo}_{bar}', 'formatted': '1_2'}, {'parameters': {'biz': 3}, 'format': '{biz}_{baz}', 'formatted': '3_NR'}]