मैं एक एपीआई के कई अंतराल का उपभोग कर रहा हूं जो डेटा लौटने में बहुत वर्बोज़ है। मैं इस डेटा का एक सबसेट कहीं और कोड के दूसरे हिस्से में प्रदान करना चाहता हूं।केवल कुछ निश्चित वस्तुओं के साथ एक नया शब्दकोश वापस करने के लिए पाइथन 3 नेस्टेड शब्दकोश को मास्क कैसे करें?
मान लीजिए मैं इस तरह कई शब्दकोशों (जो मैं के माध्यम से लूप करने की योजना है और फिल्टर) दिया हूँ:
asset = {
'id': 1,
'name': 'MY-PC',
'owner': 'me',
'location': 'New York City',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'id': 1,
'name': 'Microsoft'
}
}
}
मैं एक समारोह है कि में कि शब्दकोश ले जाएगा बनाने के लिए एक "मुखौटा" के साथ चाहते हैं जो केवल स्वीकृत वस्तुओं का एक नया शब्दकोश बनाने के लिए इस्तेमाल किया जाएगा।
mask = {
'id': True,
'name': True,
'model': {
'id': True,
'name': True,
'manufacturer': {
'name': True
}
}
}
समारोह तो यह लौटना चाहिए:
mask = {
'id': 1,
'name': 'MY-PC',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'name': 'Microsoft'
}
}
}
वहाँ कुछ पहले से ही निर्मित है (हालांकि, मैं जो कुछ भी प्रारूप जिसके परिणामस्वरूप कोड सबसे संक्षिप्त बनाता है के साथ काम कर सकते हैं) यह एक उदाहरण मुखौटा हो सकता है पायथन 3 में जो इस में सहायता करने में मदद करेगा? ऐसा लगता है कि मुझे इसे मैन्युअल रूप से करना है, तो यह काफी बदसूरत हो जाएगा। मुझे itertools.compress
मिला, लेकिन ऐसा लगता है कि यह सूचियों के लिए है और शब्दकोशों की जटिलता को संभाल नहीं पाएगा।
def copy(asset, result, mask):
for key_name, value in mask.items():
if value == True:
result[key_name] = asset[key_name]
else:
result[key_name] = x = {}
copy(asset[key_name], x, value)
y = {}
copy(asset, y, mask)
क्या आपने ['jq (1)'] (https://stedolan.github.io/jq/) के बारे में सुना है? – o11c
ywhat तब होना चाहिए जब मास्क कुंजियों के पास मेल खाने वाली डेटा कुंजी न हो? –