名前付き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'}]