Adlandırılmış Python Dize Biçimlendirmesindeki Kullanılabilir Değişkenleri Bulun [duplicate]
Bir şablon / biçimlendirme dizesi verildiğinde "{foo}_{bar}"
, gerekli biçimlendirme anahtarlarını programlı olarak nasıl çıkarabilirim ["foo", "bar"]
?
Çeşitli deneyler için parametrelerim var
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]
Gördüğünüz gibi, ikinci parametre setinde anahtar eksik baz
. Bu yüzden böyle bir şey yaptığımda
"{biz}_{baz}".format(**parameters)
baz
eksik olduğundan bir KeyError oluşturur .
Bütün değiştirmek istiyor eksik olan parmaters NR
ve onların değerleri ile mevcut tüm parametreleri doldurun.
Çıktı daha sonra:
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]
Bağlam için: Bu dize için gerekli beklenen parametreler arasında tutarlılık olmadan 100'den fazla dizem var .
Yanıtlar
Gerekli parametre adlarını dizeden verimli bir şekilde toplayabilir ve ardından gerçek anahtarlar arasında küme benzerliği olup olmadığını kontrol ederek eksik anahtar olup olmadığını kontrol edebilirsiniz. Eksik anahtarlar varsa, bunları "NR" değeriyle ekleyin. Son olarak, .format
dizeyi "biçimlendirilmiş" bir anahtara doğru şekilde biçimlendirmek için kullanın .
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'}]