मैं अजगर-3.x में एक शब्दकोश का उपयोग करते हुए एक स्ट्रिंग को कैसे प्रारूपित करूं?


215

मैं शब्दकोषों को प्रारूपण का उपयोग करने का एक बड़ा प्रशंसक हूं। यह मुझे स्ट्रिंग प्रारूप को पढ़ने में मदद करता है जिसका मैं उपयोग कर रहा हूं और साथ ही मुझे मौजूदा शब्दकोशों का लाभ उठाने देता हूं। उदाहरण के लिए:

class MyClass:
    def __init__(self):
        self.title = 'Title'

a = MyClass()
print 'The title is %(title)s' % a.__dict__

path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()

हालाँकि मैं ऐसा करने के लिए अजगर 3.x वाक्यविन्यास का पता नहीं लगा सकता (या यदि वह भी संभव है)। मैं निम्नलिखित करना चाहूंगा

# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)

# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)

जवाबों:


15

चूँकि यह प्रश्न पायथन 3 के लिए विशिष्ट है, यहाँ नया f-string सिंटैक्स का उपयोग किया जा रहा है , जो कि पायथन 3.6 के बाद से उपलब्ध है:

>>> geopoint = {'latitude':41.123,'longitude':71.091}
>>> print(f'{geopoint["latitude"]} {geopoint["longitude"]}')
41.123 71.091

बाहरी एकल उद्धरण और आंतरिक दोहरे उद्धरणों पर ध्यान दें (आप इसे दूसरे तरीके से भी कर सकते हैं)।


मैं कहूंगा कि f-string का उपयोग python3 दृष्टिकोण से अधिक संरेखित है।
जोनाटास सीडी

2
ध्यान रखें कि पाय-स्ट्रिंग्स पायथन 3.6 के लिए नए हैं, न कि 3.5 में।
ह्यूगो

409

क्या यह आपके लिए अच्छा है?

geopoint = {'latitude':41.123,'longitude':71.091}
print('{latitude} {longitude}'.format(**geopoint))

2
कोशिश की और यह काम किया। लेकिन मुझे 'पॉइंटर नोटेशन' के उपयोग की समझ नहीं है। मुझे पता है कि पायथन पॉइंटर्स का उपयोग नहीं करता है, क्या यह क्वार्ग्स का उदाहरण है?
होम्युनकुलस रेटिकुल्ली

2
@HomunculusReticulli यह एक प्रारूप पैरामीटर (न्यूनतम फ़ील्ड चौड़ाई) है, न कि सूचक C ++ शैली का सूचक। docs.python.org/release/2.4.4/lib/typesseq-strings.html
D.Rosado

29
अजगर 3.2 पेश किया format_mapके समान str.format(**mapping)है, सिवाय इसके कि mappingप्रयोग किया जाता है सीधे और नहीं एक में कॉपी किया dict। यह उपयोगी है अगर उदाहरण के mappingलिए एक
तानाशाह

1
@eugene एक अजगर शब्दकोश के लिए क्या करता है? मुझे नहीं लगता कि यह एक वस्तु बनाता है क्योंकि प्रिंट (** जियोप्रॉइंट) सिंटैक्स त्रुटि देने में विफल रहता है
नितेश अग्रवाल

4
@NityeshAgarwal यह नाम = मूल्य जोड़े के साथ शब्दकोश को अलग-अलग तर्क के रूप में फैलाता है अर्थात print(**geopoint)जैसा है print(longitude=71.091, latitude=41.123)। कई भाषाओं में, इसे स्पैट ऑपरेटर के रूप में जाना जाता है । जावास्क्रिप्ट में, इसे प्रसार ऑपरेटर कहा जाता है । अजगर में, इस ऑपरेटर को कोई विशेष नाम नहीं दिया गया है।
abhisekp

79

कीवर्ड तर्क में एक शब्दकोश को अनपैक करने के लिए, उपयोग करें **। इसके अलावा, नई-शैली स्वरूपण वस्तुओं और मैपिंग की वस्तुओं की विशेषताओं का उल्लेख करते हुए समर्थन करता है:

'{0[latitude]} {0[longitude]}'.format(geopoint)
'The title is {0.title}s'.format(a) # the a from your first example

2
मुझे यह उत्तर बेहतर लगता है, क्योंकि प्लेसहोल्डर के लिए स्थितीय सूचकांक जोड़ने से कोड अधिक स्पष्ट हो जाता है, और उपयोग करना आसान हो जाता है। खासकर अगर किसी के पास ऐसा कुछ है:'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
लोपेन

1
यह उपयोगी है यदि आप एक का उपयोग कर रहे हैं defaultdictऔर सभी कुंजी नहीं है
Whymarrh

65

जैसा कि पायथन 3.0 और 3.1 ईओएलडी हैं और कोई भी उनका उपयोग नहीं करता है, आप कर सकते हैं और इसका उपयोग करना चाहिए str.format_map(mapping)(पायथन 3.2+):

इसी के लिए str.format(**mapping), कि मानचित्रण सिवाय सीधे और नहीं एक में कॉपी किया करते थे हैdict । यह उपयोगी है यदि उदाहरण के लिए मानचित्रण एक dictउपवर्ग है।

इसका मतलब यह है कि आप उदाहरण के लिए उपयोग कर सकते हैं defaultdictजो कि गुम हो जाने वाली कुंजियों के लिए डिफ़ॉल्ट मान सेट करेगा (और वापस लौटाएगा):

>>> from collections import defaultdict
>>> vals = defaultdict(lambda: '<unset>', {'bar': 'baz'})
>>> 'foo is {foo} and bar is {bar}'.format_map(vals)
'foo is <unset> and bar is baz'

यहां तक ​​कि अगर प्रदान की गई मैपिंग एक है dict, तो एक उपवर्ग नहीं, यह शायद अभी भी थोड़ा तेज होगा।

अंतर हालांकि बड़ा नहीं है, दिया गया है

>>> d = dict(foo='x', bar='y', baz='z')

फिर

>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)

से लगभग 10 एनएस (2%) तेज है

>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)

मेरे पायथन 3.4.3 पर। यह अंतर संभवतः बड़ा होगा क्योंकि शब्दकोश में अधिक चाबियाँ हैं, और


ध्यान दें कि प्रारूप भाषा हालांकि उससे अधिक लचीली है; वे अनुक्रमित अभिव्यक्ति, विशेषता अभिगम और इतने पर हो सकते हैं , इसलिए आप एक पूरी वस्तु को प्रारूपित कर सकते हैं , या उनमें से 2:

>>> p1 = {'latitude':41.123,'longitude':71.091}
>>> p2 = {'latitude':56.456,'longitude':23.456}
>>> '{0[latitude]} {0[longitude]} - {1[latitude]} {1[longitude]}'.format(p1, p2)
'41.123 71.091 - 56.456 23.456'

3.6 से शुरू करके आप प्रक्षेपित तारों का भी उपयोग कर सकते हैं:

>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'

आपको केवल नेस्टेड कोट्स के भीतर अन्य उद्धरण वर्णों का उपयोग करने के लिए याद रखने की आवश्यकता है । इस दृष्टिकोण का एक और उल्टा तरीका यह है कि यह प्रारूपण पद्धति को कॉल करने की तुलना में बहुत तेज है


एक अच्छा, क्या कोई प्रदर्शन सुधार है format? (यह देखते हुए कि यह एक dict में कॉपी नहीं किया जाता है)
भार्गव राव

2
@BhargavRao ज्यादा नहीं, 2%: D
एंटटी हापला

@BhargavRao यदि आप प्रदर्शन की तलाश में हैं, तो इसका इस्तेमाल करें '%(latitude)s %(longitude)s'%geopoint;)
Tcll


6

अजगर 3 में भी अजगर 2 वाक्य रचना काम करती है:

>>> class MyClass:
...     def __init__(self):
...         self.title = 'Title'
... 
>>> a = MyClass()
>>> print('The title is %(title)s' % a.__dict__)
The title is Title
>>> 
>>> path = '/path/to/a/file'
>>> print('You put your file here: %(path)s' % locals())
You put your file here: /path/to/a/file

इसके अलावा यह भी अधिक ध्यान देने योग्य है f""या "".format();)
Tcll

2
geopoint = {'latitude':41.123,'longitude':71.091}

# working examples.
print(f'{geopoint["latitude"]} {geopoint["longitude"]}') # from above answer
print('{geopoint[latitude]} {geopoint[longitude]}'.format(geopoint=geopoint)) # alternate for format method  (including dict name in string).
print('%(latitude)s %(longitude)s'%geopoint) # thanks @tcll

1
आप एक चूक गए;) print('%(latitude)s %(longitude)s'%geopoint)यह अन्य 2 की तुलना में काफी तेज है
Tcll

@tcll वास्तव में मुझे उदाहरण चाहिए थे, जहां मैं स्ट्रिंग के अंदर शब्दकोश नाम का उपयोग कर सकता हूं। कुछ इस तरह'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
शेख अब्दुल वाहिद

1

अधिकांश जवाबों ने केवल तानाशाह के मूल्यों को स्वरूपित किया।

आप चाहते हैं भी महत्वपूर्ण स्वरूपित स्ट्रिंग आप उपयोग कर सकते में dict.items () :

geopoint = {'latitude':41.123,'longitude':71.091}
print("{} {}".format(*geopoint.items()))

आउटपुट:

('अक्षांश', 41.123) ('देशांतर', 71.091)

यदि आप एक मनमाने तरीके से प्रारूपित करना चाहते हैं, अर्थात ट्यूल जैसे मुख्य-मान नहीं दिखा रहे हैं:

from functools import reduce
print("{} is {} and {} is {}".format(*reduce((lambda x, y: x + y), [list(item) for item in geopoint.items()])))

आउटपुट:

अक्षांश 41.123 और देशांतर 71.091 है


कृपया ध्यान दें कि एक मौका 'देशांतर' 'अक्षांश' से पहले आ सकता है geopoint.items();)
टीसीएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.