सूचियों के साथ पायथन स्ट्रिंग फ़ॉर्मेटिंग का उपयोग करना


111

मैं sपायथन 2.6.5 में एक स्ट्रिंग का निर्माण करता हूं %s, जिसमें अलग-अलग संख्या में टोकन होंगे, जो सूची में प्रविष्टियों की संख्या से मेल खाते हैं x। मुझे एक प्रारूपित स्ट्रिंग लिखने की आवश्यकता है। निम्नलिखित काम नहीं करता है, लेकिन इंगित करता है कि मैं क्या करने की कोशिश कर रहा हूं। इस उदाहरण में, तीन %sटोकन हैं और सूची में तीन प्रविष्टियाँ हैं।

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

मुझे आउटपुट स्ट्रिंग पसंद है:

1 BLAH 2 FOO 3 BAR

जवाबों:


112
print s % tuple(x)

के बजाय

print s % (x)

5
(x)जैसा है वैसा ही है x। एकल कोष्ठक में रखने का पायथन में कोई अर्थ नहीं है। आप आम तौर पर foo = (bar, )पढ़ने के लिए आसान बनाने के लिए कोष्ठक डालते हैं, लेकिन foo = bar,ठीक यही काम करते हैं।
12

11
print s % (x)ओपी ने जो लिखा है, मैं उसे उद्धृत कर रहा था।
अवरक्त

मैं सिर्फ एक भाषा टिप प्रदान कर रहा था, आपके उत्तर की आलोचना नहीं कर रहा था (वास्तव में मैंने इसे +1 किया था)। आप नहीं लिखा था foo = (bar, )या तो :)
patrys

2
मैं (x)स्पष्टता के लिए संकेतन का उपयोग करता हूं ; यदि आप बाद में अतिरिक्त चर जोड़ते हैं तो यह कोष्ठक को भूलने से भी बचाता है।
सब्रेवुल्फी

यदि आप कई सूचियों से अपने चर का स्रोत बनाना चाहते हैं तो कैसा रहेगा? tuple केवल एक ही सूची लेता है, और फ़ॉर्मेटर केवल एक tuple लेने के लिए लगता है
irant.info

150

आपको अजगर के प्रारूप विधि पर एक नज़र रखना चाहिए । आप फिर अपने स्वरूपण स्ट्रिंग को इस तरह परिभाषित कर सकते हैं:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
ओपी की समस्या विधि नहीं बल्कि मापदंडों का प्रारूप है। %ऑपरेटर केवल ट्यूपल्स को अनपैक करता है।
patrys

इससे निर्माण sअधिक जटिल हो जाएगा, क्योंकि मुझे %sप्रत्येक पद के लिए केवल संख्या के बजाय वेतन वृद्धि संख्याओं को शामिल करना होगा । sकई अलग-अलग चरणों में बनाया गया है, इसलिए %sटोकन को शामिल करना बहुत आसान है ।
सब्रेवॉल्फी

2
यदि आप पूर्ववर्ती रूप से इसका निर्माण करते हैं, तो आपको अपने प्लेसहोल्डर्स का नाम देना आसान है और परिणामस्वरूप स्ट्रिंग को प्रारूपित करने के लिए एक ताना का उपयोग करना आसान हो सकता है print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}:।
patrys

2
@ सबेरेवॉल्फी: पायथन 2.7 में, आप फील्ड नंबरों को छोड़ सकते हैं:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
आगे की सूचना तक

यह उत्तर संभावित रूप से भ्रामक है, क्योंकि यह 0, 1 और 2 के संख्यात्मक मानों की तरह दिखता है जो किसी भी समय "BLAH" शब्द के प्रकट होने की संख्या से संबंधित हैं।
सब्रेवॉल्फी

31

इस संसाधन पृष्ठ के बाद , यदि x की लंबाई अलग-अलग हो, तो हम उपयोग कर सकते हैं:

', '.join(['%.2f']*len(x))

सूची से प्रत्येक तत्व के लिए एक स्थान धारक बनाने के लिए x। यहाँ उदाहरण है:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
लिंक अब मर चुका है।
एमके हंटर

19

यहाँ एक लाइनर है। एक सूची को पुनरावृत्त करने के लिए प्रिंट () के साथ प्रारूप का उपयोग करते हुए थोड़ा सा सुधारित उत्तर।

इस बारे में कैसे (अजगर 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

प्रारूप () का उपयोग करने पर यहां डॉक्स पढ़ें ।


18

जब से मैंने इस शांत चीज़ के बारे में सीखा है (एक प्रारूप स्ट्रिंग के भीतर से सूचियों में सूचीबद्ध करना) मैं इस पुराने प्रश्न को जोड़ रहा हूं।

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

आउटपुट:

1 BLAH 2 FOO 3 BAR

हालाँकि, मुझे अभी तक यह पता नहीं चला है कि स्लाइसिंग कैसे करनी है (प्रारूप स्ट्रिंग के अंदर '"{x[2:4]}".format...), और यह पता लगाना अच्छा लगेगा कि अगर किसी को कोई विचार है, हालांकि मुझे संदेह है कि आप बस ऐसा नहीं कर सकते।


मैं टुकड़ा करने की क्रिया के लिए आपके उपयोग के मामले में थोड़ा उत्सुक हूं।
माइकल

1
मेरे पास वास्तव में एक नहीं है ... मुझे लगता है कि मैंने सोचा था कि यह करने में सक्षम होगा
जोरन बेज़ले

11

यह एक मजेदार सवाल था! चर लंबाई सूचियों के लिए इसे संभालने का एक और तरीका एक फ़ंक्शन का निर्माण करना है जो .formatविधि और सूची अनपैकिंग का पूरा लाभ लेता है । निम्नलिखित उदाहरण में मैं किसी भी फैंसी स्वरूपण का उपयोग नहीं करता हूं, लेकिन यह आसानी से आपकी आवश्यकताओं के अनुरूप बदला जा सकता है।

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

@ नोबोट के उत्तर के समान लेकिन थोड़ा अधिक आधुनिक और रसीला।

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

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