संभव डुप्लिकेट ASCII करने के लिए यूनिकोड से तार के जटिल शब्दकोश कन्वर्ट:
How to get string Objects instead Unicode ones from JSON in Python?पायथन:
मैं JSON API कॉल से पार्स बहु स्तरीय शब्दकोशों के रूप में इनपुट के एक बहुत कुछ है। तार सभी यूनिकोड में हैं जिसका अर्थ है कि u'stuff like this'
बहुत सारे हैं। मैं परिणामों के साथ खेलने के लिए jq का उपयोग कर रहा हूं और इन परिणामों को ASCII में परिवर्तित करने की आवश्यकता है।
मैं जानता हूँ कि मैं एक समारोह में लिख सकते हैं तो बस ऐसा कन्वर्ट करने के लिए:
def convert(input):
if isinstance(input, dict):
ret = {}
for stuff in input:
ret = convert(stuff)
elif isinstance(input, list):
ret = []
for i in range(len(input))
ret = convert(input[i])
elif isinstance(input, str):
ret = input.encode('ascii')
elif :
ret = input
return ret
यह और भी सही है? निश्चित नहीं। यही वह नहीं है जिसे मैं आपसे पूछना चाहता हूं।
मैं जो पूछ रहा हूं वह यह है कि यह समस्या का एक सामान्य ब्रूट-फोर्स समाधान है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। ' एक और पाइथोनिक तरीका। मैं एल्गोरिदम पर कोई विशेषज्ञ नहीं हूं, लेकिन यह विशेष रूप से तेज़ नहीं दिखता है।
तो क्या कोई बेहतर तरीका है? या यदि नहीं, तो क्या यह कार्य बेहतर हो सकता है ...?
पोस्ट-जवाब संपादित
Mark Amery's answer सही है लेकिन मैं इसे का एक संशोधित संस्करण पोस्ट करने के लिए करना चाहते हैं। उनकी समारोह अजगर पर काम करता है 2.7+ और मैं 2.6 पर हूँ तो यह परिवर्तित करने के लिए किया था:
def convert(input):
if isinstance(input, dict):
return dict((convert(key), convert(value)) for key, value in input.iteritems())
elif isinstance(input, list):
return [convert(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
यदि आप पाइथन 2 पर हैं, तो यूनिकोड 'str' का उदाहरण नहीं है, बल्कि 'यूनिकोड' का उदाहरण नहीं है। साथ ही, 'सूची' और 'dict' प्रसंस्करण में, आप इसे गलत कर रहे हैं। – agf
सूची के मामले में, आप किसी भी पुनरावर्तनीय को संभालने पर विचार करना चाहेंगे। किसी भी मामले में, यदि आप इनपुट में एक्स के लिए 'ret = [convert (x) के साथ if स्टेटमेंट की उस शाखा को प्रतिस्थापित कर सकते हैं]। इसके अलावा, अपने शब्दकोश केस की जांच करें। 'ret' में केवल उसमें शामिल होगा जो शब्दकोश में अंतिम कुंजी को परिवर्तित करता है। –
@MichaelMior आपके द्वारा वर्णित तरीके से किसी भी पुनरावर्तनीय को संभालने में समस्या यह है कि सभी पुनरावृत्तियों सूची-जैसी नहीं हैं। उदाहरण के लिए, शब्दकोश इटेरिएबल हैं, लेकिन इनपुट में एक्स के लिए 'ret = [convert (x) इनपुट]' स्पष्ट रूप से नहीं है कि हम चाहते हैं कि 'इनपुट' एक शब्दकोश है। –