पायथन में स्ट्रिंग स्वरूपण के लिए कई तर्कों का उपयोग करना (जैसे, '% s ...% s')


174

मेरे पास एक स्ट्रिंग है जो दिखता है '%s in %s'और मैं जानना चाहता हूं कि कैसे तर्कों को अलग करना है ताकि वे दो अलग-अलग% s हों। मेरा मन जावा से आ रहा है:

'%s in %s' % unicode(self.author),  unicode(self.publication)

लेकिन यह काम नहीं करता है तो यह पायथन में कैसे दिखता है?

जवाबों:


191

मार्क सिडेड का जवाब सही है - आपको एक टपल की आपूर्ति करने की आवश्यकता है।

हालाँकि पाइथन 2.6 के बाद से आप formatइसके बजाय उपयोग कर सकते हैं %:

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

%स्ट्रिंग्स को प्रारूपित करने के लिए उपयोग को प्रोत्साहित नहीं किया जाता है।

स्ट्रिंग स्वरूपण की यह विधि पायथन 3.0 में नया मानक है, और इसे नए कोड में स्ट्रिंग स्वरूपण संचालन में वर्णित% स्वरूपण के लिए प्राथमिकता दी जानी चाहिए।


5
पायथन 2.7 के साथ शुरू करके वह सूचकांक संख्या को छोड़ सकता है, अर्थात एक सादे '{} in {}'प्रारूप स्ट्रिंग का उपयोग कर सकता है ।
क्रिस्टियान सियुपिटु

121

यदि आप एक से अधिक तर्क का उपयोग कर रहे हैं, तो इसे टपल में होना चाहिए (अतिरिक्त कोष्ठकों पर ध्यान दें):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

जैसा कि EOL बताता है, unicode()फ़ंक्शन आमतौर पर ascii एन्कोडिंग को एक डिफ़ॉल्ट मानता है, इसलिए यदि आपके पास गैर-ASCII वर्ण हैं, तो यह स्पष्ट रूप से एन्कोडिंग को पारित करने के लिए सुरक्षित है:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

और पायथन 3.0 के रूप में, इसके str.format()बजाय सिंटैक्स का उपयोग करना पसंद किया जाता है:

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))

60

एकाधिक तर्क के लिए टपल / मैपिंग ऑब्जेक्ट पर format

निम्नलिखित प्रलेखन से अंश है:

यह देखते हुए format % values, %रूपांतरण विशिष्टताओं में formatकी शून्य या अधिक तत्वों के साथ बदल दिया जाता है values। प्रभाव sprintf()सी भाषा में उपयोग के समान है ।

यदि formatकिसी एकल तर्क की आवश्यकता है, तो मान एक एकल गैर-तुच्छ वस्तु हो सकते हैं। अन्यथा, मान formatस्ट्रिंग द्वारा निर्दिष्ट वस्तुओं की संख्या , या एकल मैपिंग ऑब्जेक्ट (उदाहरण के लिए, एक शब्दकोश) के साथ टपल होना चाहिए

संदर्भ


के str.formatबजाय पर%

%ऑपरेटर के लिए एक नया विकल्प उपयोग करना है str.format। यहाँ प्रलेखन से एक अंश है:

str.format(*args, **kwargs)

एक स्ट्रिंग स्वरूपण ऑपरेशन करें। जिस स्ट्रिंग पर यह विधि कहा जाता है, उसमें शाब्दिक पाठ या प्रतिस्थापन फ़ील्ड ब्रेसिज़ द्वारा सीमांकित हो सकते हैं {}। प्रत्येक प्रतिस्थापन फ़ील्ड में या तो स्थितीय तर्क का संख्यात्मक सूचकांक होता है, या कीवर्ड तर्क का नाम होता है। स्ट्रिंग की एक प्रति लौटाता है जहां प्रत्येक प्रतिस्थापन फ़ील्ड को इसी तर्क के स्ट्रिंग मान से बदल दिया जाता है।

यह विधि पायथन 3.0 में नया मानक है, और इसे %स्वरूपण के लिए प्राथमिकता दी जानी चाहिए

संदर्भ


उदाहरण

यहाँ कुछ उपयोग उदाहरण हैं:

>>> '%s for %s' % ("tit", "tat")
tit for tat

>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles

>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond

>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond

यह सभी देखें


मेरे पास इसका परीक्षण करने का कोई तरीका नहीं है (मैं अजगर को इतना नहीं जानता), लेकिन उदाहरणों से लगता है कि कुछ ऐसा '{self.author} in {self.publication}'.format(self=self)होना चाहिए जो "काम" करे। मुझे पूरी unicodeबात पर यकीन नहीं है ।
पॉलीजेन लुब्रिकेंट

1
हां, आप वास्तव में विशेषताओं (और सूचकांकों) तक भी पहुंच सकते हैं। Docs.python.org/library/string.html#formatstrings देखें तो आपके उदाहरण में आप {first[0]}प्रारंभिक प्राप्त करने के लिए उपयोग कर सकते थे J
डंकन

10

आपको मानों को केवल कोष्ठकों में रखना होगा:

'%s in %s' % (unicode(self.author),  unicode(self.publication))

यहाँ, पहले के लिए रखा जाएगा। और दूसरे के लिए , इच्छा का उपयोग किया जाएगा।%sunicode(self.author)%sunicode(self.publication)

ध्यान दें: आप के पक्ष में होना चाहिए string formattingसे अधिक %संकेतन। अधिक जानकारी यहाँ


मैं विश्वास नहीं कर सकता कि लोग अभी भी सुझाव है %sतो बजायformat
user1767754

8

अब तक पोस्ट किए गए कुछ उत्तरों के साथ एक महत्वपूर्ण समस्या है: unicode()डिफ़ॉल्ट एन्कोडिंग से डीकोड, जो अक्सर ASCII है; वास्तव में, unicode()यह बाइट्स की "समझ" बनाने की कोशिश करता है, जो उन्हें पात्रों में परिवर्तित करके दिया जाता है। इस प्रकार, निम्नलिखित कोड, जो अनिवार्य रूप से पिछले उत्तरों द्वारा अनुशंसित है, मेरी मशीन पर विफल रहता है:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

देता है:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

विफलता इस तथ्य से आती है authorजिसमें केवल ASCII बाइट्स नहीं होते हैं (अर्थात [0; 127] में मूल्यों के साथ), और unicode()डिफ़ॉल्ट रूप से ASCII से डिकोड (कई मशीनों पर)।

एक मजबूत समाधान स्पष्ट रूप से आपके क्षेत्रों में उपयोग किए गए एन्कोडिंग को देना है; उदाहरण के रूप में UTF-8 लेना:

u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))

(या प्रारंभिक के बिना u, इस पर निर्भर करता है कि आप एक यूनिकोड परिणाम या बाइट स्ट्रिंग चाहते हैं)।

इस बिंदु पर, कोई व्यक्ति फॉर्मेटिंग के दौरान उन्हें डिकोड करने के बजाय, उन फ़ील्ड्स authorऔर publicationफ़ील्ड्स को यूनिकोड स्ट्रिंग्स होने पर विचार कर सकता है।


5

Python2 के लिए आप यह भी कर सकते हैं

'%(author)s in %(publication)s'%{'author':unicode(self.author),
                                  'publication':unicode(self.publication)}

यदि आपके पास स्थानापन्न करने के लिए बहुत सारे तर्क हैं (विशेषकर यदि आप अंतर्राष्ट्रीयकरण कर रहे हैं)

Python2.6 आगे की ओर समर्थन करता है .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)

4

आप इसे भी साफ और सरल (लेकिन गलत का उपयोग कर सकते हैं! क्योंकि आपको formatमार्क बायर्स ने कहा) का उपयोग करना चाहिए :

print 'This is my %s formatted with %d arguments' % ('string', 2)

3

पूर्णता के लिए, अजगर में 3.6 एफ-स्ट्रिंग PEP-498 में पेश किए जाते हैं । ये तार इसे संभव बनाते हैं

न्यूनतम सिंटैक्स का उपयोग करते हुए, स्ट्रिंग शाब्दिक के अंदर अभिव्यक्ति एम्बेड करें।

इसका मतलब यह होगा कि आपके उदाहरण के लिए भी आप उपयोग कर सकते हैं:

f'{self.author} in {self.publication}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.