2017-10-25 11 views
8

मान लीजिए मैं 3 अजगर तार है और मैं 2 निम्नलिखित में की तरह उन दोनों के बीच अलग रिक्तियों के साथ उन सभी को 3 फ़ॉर्मेट कर सकते हैं:अतिरिक्त स्थान होता स्वरूपण

h="hello" 
m="my" 
w="world" 

print("{} {} {}".format(h,m,w)) 

या का उपयोग कर

print("%s %s %s" % (h,m,w)) 

मान लीजिए कि अब मुझे यकीन है कि एच और डब्ल्यू दोनों के पास मान हैं लेकिन एम एक खाली स्ट्रिंग हो सकती है। उपरोक्त दो कोड खंडों के परिणामस्वरूप "hello{two speces here}world होगा।

मुझे पता है कि मैं करने के लिए विभिन्न कार्यों और सशर्त भाव का उपयोग कर सकते ऐसे में

print(h+" " + m+(" " if len(m)>0 else "") + w) 

या एक अलग स्वरूपण स्ट्रिंग

print(("{} {} {}" if len(m)>0 else "{}{} {}").format(h,m,w)) 

लेने की लंबाई के आधार के रूप में कोड द्वारा स्वरूपण करना मीटर।

मेरा प्रश्न यह स्वरूपण स्ट्रिंग्स का उपयोग करके किया जा सकता है? (उदाहरण के लिए कुछ प्रारूप संशोधक जो 1 पैरामीटर के साथ पैड करेगा यदि इसका पैरामीटर खाली नहीं है)।

+1

मैंने दस्तावेज़ों की जांच की, मुझे नहीं लगता कि आप कर सकते हैं। –

उत्तर

4

यकीन नहीं यह बहुत सुविधाजनक है, लेकिन वहाँ एक रास्ता है, अंतरिक्ष पैदा करने या "सच" तार के मूल्य के आधार पर नहीं:

h="hello" 
m="my" 
w="world" 

print("{}{}{}{}".format(h," "*bool(m),m,w)) 

परिणाम:

hello my world 

अब m सेट खाली स्ट्रिंग, आपको

hello world 
3

मुझे यकीन नहीं है कि यह फ़ॉर्मेटिंग तारों के साथ किया जा सकता है।

मैं python string join के साथ ऐसा करूँगा।

strings = [h, m, w] 
print " ".join([s for s in strings if len(s)>0]) 

आंतरिक भाग [s for s in strings if len(s)>0] केवल शून्य शून्य लंबाई तारों के साथ एक सूची बनाता है। फिर " ".join(...) उन लोगों के साथ एक स्थान के साथ मिलकर जुड़ता है।

+2

हालांकि यह उत्तर _wrong_ नहीं है, यह ओपी के प्रश्न को संबोधित नहीं करता है: 'क्या यह स्वरूपण तारों का उपयोग करके किया जा सकता है?' –

+2

'' "के अलावा।" जॉइन (एसए में एस के लिए यदि लेंस (0)> 0] बेकार: '" ".join (एस एस में स्ट्रिंग्स के लिए एस है]) 'अधिक pythonic –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ पूरी तरह से सहमत है, मैं शुद्ध स्वरूपण के साथ ऐसा करने का कोई तरीका नहीं देख सकता, लेकिन मैं कहना नहीं चाहता यह नामुमकिन है। –

2

मेरा मानना ​​है कि प्रारूप के साथ यह संभव नहीं है सभी अकेले टिंग तार।

आप स्वरूपण तार का उपयोग करने के लिए यदि आप फिर से मॉड्यूल इस्तेमाल कर सकते हैं स्वरूपण लागू करने के बाद अतिरिक्त रिक्त स्थान से छुटकारा पाने के:

import re 

    h="hello" 
    m="my" 
    w="world" 

    p = re.compile('\s+') 

    print p.sub(" ","{} {} {}".format(h,m,w)) 

जायें जो कि उत्पादन:

hello my world 

कोई रिक्त स्ट्रिंग के साथ :

print p.sub(" ","{} {} {}".format(h,"",w)) 

होगा उत्पादन:

hello world 

क्या यह आप के बाद क्या है?

0

आप नई शैली स्ट्रिंग स्वरूपण के साथ Parametrized formats का उपयोग कर सकते हैं, लेकिन आपको अभी भी परीक्षण करना होगा कि m खाली है या नहीं।

def fmt(h, m, w): 
    return return '{}{:>{wd}} {}'.format(h, m, w, wd=len(m)+1 if m else 0) 

>>> fmt('hello', 'my', 'world') 
'hello my world' 
>>> fmt('hello', '', 'world') 
'hello world' 
1

मैं स्वीकार करेंगे @ जीन फ़्राँस्वा Fabre के जवाब यह है कि मूल रूप से मेरी सवाल का जवाब के रूप में मैं यह कह रही है कि (कम से कम अब के लिए) वहाँ केवल स्ट्रिंग स्वरूपण का उपयोग कर इस को कोई जवाब नहीं है द्वारा निर्दिष्ट (यानी अगर बनाने के लिए चर केवल एच, एम & डब्ल्यू अतिरिक्त प्रसंस्करण के बिना हैं)।

हालांकि, उनकी जवाब में के रूप में तारों पर बूलियन ऑपरेटरों की अवधारणा का उपयोग कर मुझे लगता है कि मैं का उपयोग करेगा:

print("{}{}{} {}".format(h,m and " " ,m , w)) 

इस व्यक्ति को यह लग रहा है कि 4 मूल्यों से स्वरूपित किया जा रहा है पढ़ने देने का नुकसान है (जो तकनीकी रूप से मामला है लेकिन अर्थात् नहीं) लेकिन मुझे लगता है कि यहां अभिव्यक्तियों की कमी और सादगी नकारात्मक पहलू को दूर करती है।

पठनीयता अभी तक के रूप में @Tsingyi ने सुझाव दिया parametrized स्वरूपों का उपयोग लेकिन का उपयोग करके सुधार किया जा सकता है:

print("{}{pad}{} {}".format(h, m , w, pad = m and " ")) 

नोट: उम्मीद है कि
में:
लेखन के समय का पालन नहीं कर काम कर रहा है कोड

print("{}{: >?} {}".format(h,m,w)) 
"के शब्दों को वैकल्पिक रूप से

(यदि मीटर तो) सही और एक additio साथ पैड को संरेखित: भविष्य शायद हम जैसे कुछ कर सकता है उसके बाईं ओर एनएएल अंतरिक्ष ", या

print("{} {: <?}{}".format(h,m,w)) 
के शब्दों के साथ

" वैकल्पिक रूप से (यदि मीटर तो) यह छोड़ दिया और पैड करने का अधिकार "के लिए एक अतिरिक्त स्थान से तालमेल

समान वेरिएंट उपयोगी हो सकता है मुद्रा प्रतीकों के वैकल्पिक स्वरूपण के लिए उदाहरण के लिए

print("{:$>?}{}".format(s)) 

या तो एक खाली स्ट्रिंग या $ 123

एक अंतिम (लंबी) टिप्पणी उपज के लिए: इस मुद्दे मैंने सोचा था कि मैं इस तरह कुछ करने के लिए सक्षम हो सकता है की मेरी शोध के दौरान कुछ बिंदु पर :

def extend_string_formatting(): 
    try: 
     '{:left-pad-if-not-empty}'.format('') 
    except ValueError: 
     original_formatter=str.__format__ 

     def extended_formatter(self, format): 
      if (format == 'left-pad-if-not-empty'): 
       return ' ' + self if self else '' 
      return original_formatter(self, format) 

     str.__format__=extended_formatter 
extend_string_formatting() 

लेकिन यह है कि इस के साथ परिणाम पता चला है:

Traceback (most recent call last): 
    File "<input>", line 3, in extend_string_formatting 
ValueError: Invalid format specifier 
During handling of the above exception, another exception occurred: 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "<input>", line 12, in extend_string_formatting 
TypeError: can't set attributes of built-in/extension type 'str' 

शायद इसे यहां वर्णित कुछ की तरह हासिल किया जा सकता है: https://stackoverflow.com/a/15975791/25412

+1

बीटीडब्ल्यू: https: // मेटा।stackoverflow.com/questions/291764/is-mentioning-someones-username-in-an-answer-supposed-to-send-them-a-notificat –

संबंधित मुद्दे