नामांकित पायथन स्ट्रिंग फ़ॉर्मेटिंग [डुप्लिकेट] में उपलब्ध चर खोजें
टेम्प्लेट / फ़ॉर्मेटिंग स्ट्रिंग को देखते हुए "{foo}_{bar}"
, मैं प्रोग्रामेटिक रूप से आवश्यक फ़ॉर्मेटिंग कुंजी कैसे निकाल सकता हूँ ["foo", "bar"]
?
मेरे पास विभिन्न प्रयोगों के लिए पैरामीटर हैं
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]
जैसा कि आप देख सकते हैं, दूसरा पैरामीटर सेट कुंजी गायब है baz
। इसलिए जब मैं कुछ ऐसा करता हूं
"{biz}_{baz}".format(**parameters)
, यह एक KeyError उठाता है, क्योंकि baz
गायब है।
मैं सभी अनुपलब्ध परमात्माओं को प्रतिस्थापित करना चाहता हूं NR
, और सभी उपलब्ध मापदंडों को उनके मूल्यों के साथ भरना चाहता हूं ।
आउटपुट तब है:
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]
संदर्भ के लिए: मैं के बीच कोई निरंतरता के साथ 100 + तार है, उम्मीद है कि स्ट्रिंग के लिए आवश्यक मानकों।
जवाब
आप स्ट्रिंग से आवश्यक पैरामीटर नाम को कुशलता से इकट्ठा कर सकते हैं, और फिर जांच कर सकते हैं कि क्या वास्तविक कुंजी के बीच सेट समानता के लिए जाँच करके कोई लापता कुंजी है या नहीं। यदि गुम चाबियाँ हैं, तो उन्हें "एनआर" मान के साथ जोड़ें। अंत में, .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'}]