निश्चित चौड़ाई में स्ट्रिंग कैसे प्रिंट करें?


103

मेरे पास यह कोड है (एक स्ट्रिंग में सभी क्रमपरिवर्तन की घटना को मुद्रित करना)

def splitter(str):
    for i in range(1, len(str)):
        start = str[0:i]
        end = str[i:]
        yield (start, end)
        for split in splitter(end):
            result = [start]
            result.extend(split)
            yield result    

el =[];

string = "abcd"
for b in splitter("abcd"):
    el.extend(b);

unique =  sorted(set(el));

for prefix in unique:
    if prefix != "":
        print "value  " , prefix  , "- num of occurrences =   " , string.count(str(prefix));

मैं सभी क्रमिक घटना को वहां छपे वार्इबल में छापना चाहता हूं।

चूँकि क्रमचय समान लंबाई में नहीं है, इसलिए मैं चौड़ाई को ठीक करना चाहता हूं और इसे इस तरह से नहीं मुद्रित करना चाहता:

value   a - num of occurrences =    1
value   ab - num of occurrences =    1
value   abc - num of occurrences =    1
value   b - num of occurrences =    1
value   bc - num of occurrences =    1
value   bcd - num of occurrences =    1
value   c - num of occurrences =    1
value   cd - num of occurrences =    1
value   d - num of occurrences =    1

मैं formatइसे करने के लिए कैसे उपयोग कर सकता हूं ?

मुझे ये पोस्ट मिले लेकिन यह अल्फ़ान्यूमेरिक स्ट्रिंग्स के साथ अच्छी तरह से नहीं चला:

अजगर स्ट्रिंग निश्चित चौड़ाई स्वरूपण

अजगर के साथ निश्चित लंबाई निर्धारित करना


1
क्या '% 10s'% 'मिस्ट्रींग' के बारे में
TJD

2
आश्चर्य है कि "\t"किसी भी समाधान में एक विकल्प के रूप में सूचीबद्ध नहीं है।

जवाबों:


113

EDIT 2013-12-11 - यह उत्तर बहुत पुराना है। यह अभी भी मान्य और सही है, लेकिन इसे देखने वाले लोगों को नए प्रारूप के सिंटैक्स को प्राथमिकता देनी चाहिए ।

आप स्ट्रिंग स्वरूपण का उपयोग इस तरह कर सकते हैं :

>>> print '%5s' % 'aa'
   aa
>>> print '%5s' % 'aaa'
  aaa
>>> print '%5s' % 'aaaa'
 aaaa
>>> print '%5s' % 'aaaaa'
aaaaa

मूल रूप से:

  • %चरित्र सूचित अजगर यह एक टोकन के लिए स्थानापन्न कुछ करना होगा
  • sटोकन अजगर चरित्र सूचित एक स्ट्रिंग होगा
  • 5(या जो भी संख्या आप चाहें तो) पैड को सूचित अजगर 5 अक्षर के लिए रिक्त स्थान के साथ स्ट्रिंग अप।

आपके विशिष्ट मामले में एक संभावित कार्यान्वयन जैसा दिख सकता है:

>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1}
>>> for item in dict_.items():
...     print 'value %3s - num of occurances = %d' % item # %d is the token of integers
... 
value   a - num of occurances = 1
value  ab - num of occurances = 1
value abc - num of occurances = 1

ध्यान दें: यदि आप itertoolsमॉड्यूल के अस्तित्व के बारे में जानते हैं तो बस आश्चर्य होगा । उदाहरण के लिए आप एक पंक्ति में अपने सभी संयोजनों की सूची प्राप्त कर सकते हैं:

>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)]
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']

और आप combinationsके साथ संयोजन के रूप में होने वाली घटनाओं की संख्या प्राप्त कर सकते हैं count()


24
आपको शायद यह उल्लेख करना चाहिए कि नकारात्मक संख्याएं बाएं-उचित पैडेड आउटपुट देती हैं; यह शुरुआत के लिए शायद ही सहज है।
ट्रिपल ओक्ट

+1 के लिए @tripleee, आपकी नकारात्मक संख्याओं के बिना वाम-औचित्यपूर्ण टिप्पणी मैं अपने सिर को लंबे समय तक मार रहा होता ... thx m8।
ब्रिफ़ोर्ड वायली

यह नए str.format की तुलना में कहीं अधिक सहज और संक्षिप्त है। मुझे समझ नहीं आ रहा है कि
सजा के

क्या रिक्त स्थानों को एक विशिष्ट चरित्र के साथ भरने का एक तरीका है? उदाहरण के लिए, यदि हमें "5" के बजाय "05" प्रिंट करने की आवश्यकता है
हर्षित जिंदल

1
माध्यम पर एफ-स्ट्रिंग्स के साथ सुरुचिपूर्ण निश्चित-चौड़ाई मुद्रण के लिए यहां कुछ और चालें हैं ।
pfabri

198

मैं str.formatबहुत अधिक सुरुचिपूर्ण का उपयोग कर पाता हूं :

>>> '{0: <5}'.format('ss')
'ss   '
>>> '{0: <5}'.format('sss')
'sss  '
>>> '{0: <5}'.format('ssss')
'ssss '
>>> '{0: <5}'.format('sssss')
'sssss'

यदि आप स्ट्रिंग को >इसके बजाय सही उपयोग के लिए संरेखित करना चाहते हैं <:

>>> '{0: >5}'.format('ss')
'   ss'

संपादित करें: जैसा कि टिप्पणियों में बताया गया है: 0 इंगित करता है कि तर्क का सूचकांक पास हो गया है str.format()


5
इसके अतिरिक्त, 0 प्रारूप तर्क की स्थिति को इंगित करता है, इसलिए आप दो अन्य चीजें कर सकते हैं: '{<5}'.format('ss') 'ss 'पहले की तरह, लेकिन 0 के बिना, एक ही काम करता है या 'Second {1: <5} and first {0: <5}'.format('ss', 'sss') 'Second sss and first ss 'तो आप एक ही आउटपुट में कई बार एक ही चर को फिर से व्यवस्थित या आउटपुट कर सकते हैं। स्ट्रिंग।
मेयिपाइल

14
मैं अब पिछली टिप्पणी को संपादित नहीं कर सकता, जिसकी आवश्यकता है। {<5}काम नहीं करता है, लेकिन {: <5}सूचकांक मूल्य के बिना काम करता है।
mightypile

9
यहां इन प्रारूप स्ट्रिंग और अतिरिक्त विकल्पों का वर्णन करते हुए पायथन प्रारूप विशिष्टता मिनी-भाषा है । त्वरित संदर्भ के लिए, अंतरिक्ष में {0: <5}है [fill] , <है [align], और 5है[width]
कोड 3monk3y

2
कि 5 एक चर प्रतिस्थापन हो सकता है>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
user2763554

4
आप संख्याओं का उपयोग भी कर सकते हैं और क्रम में केवल चर सूचीबद्ध कर सकते हैं width=10; "{0: <{1}}".format('sss', width)। या यहां तक ​​कि संख्याओं को छोड़ दें'{: <{}}'.format('sss', width)
joelostblom

71

मूल रूप से @ 0x90 के उत्तर को संपादित करने के रूप में पोस्ट किया गया था, लेकिन यह पोस्ट के मूल इरादे से भटकने के लिए खारिज कर दिया गया और टिप्पणी या उत्तर के रूप में पोस्ट करने की सिफारिश की गई, इसलिए मैं यहां संक्षिप्त लेखन सहित हूं।

@ 0x90 से उत्तर के अलावा, चौड़ाई के लिए एक चर का उपयोग करके सिंटैक्स को अधिक लचीला बनाया जा सकता है (जैसा कि @ user2763554 की टिप्पणी के अनुसार):

width=10
'{0: <{width}}'.format('sss', width=width)

इसके अलावा, आप केवल संख्याओं का उपयोग करके और पारित किए गए तर्कों के आदेश पर भरोसा करके, इस अभिव्यक्ति को दुखी कर सकते हैं format:

width=10
'{0: <{1}}'.format('sss', width)

या यहां तक ​​कि अधिकतम, संभावित गैर-कृत्रिम रूप से निहित, कॉम्पैक्टनेस के लिए सभी नंबरों को छोड़ दें:

width=10
'{: <{}}'.format('sss', width)

अपडेट 2017-05-26

पायथन 3.6 में स्वरूपित स्ट्रिंग शाब्दिक (संक्षेप में "एफ-स्ट्रिंग्स") की शुरुआत के साथ , अब पहले से परिभाषित परिभाषित चर को ब्रीफ़ेर सिंटैक्स के साथ एक्सेस करना संभव है:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

यह स्ट्रिंग प्रारूपण पर भी लागू होता है

>>> width=10
>>> string = 'sss'
>>> f'{string: <{width}}'
'sss       '

मुझे वास्तव में यह उत्तर सबसे ज्यादा पसंद है!
सिरिटिस मेजर

10

formatनिश्चित रूप से सबसे सुंदर तरीका है, लेकिन अफ़ीम आप इसका उपयोग अजगर के loggingमॉड्यूल के साथ नहीं कर सकते हैं , इसलिए यहां बताया गया है कि %प्रारूपण का उपयोग करके आप इसे कैसे कर सकते हैं :

formatter = logging.Formatter(
    fmt='%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s',
)

यहां, -बाएं-संरेखण को इंगित करता है, और पहले की संख्या sनिश्चित चौड़ाई को इंगित करता है।

कुछ नमूना उत्पादन:

2017-03-14 14:43:42,581 | this-app             | INFO       | running main
2017-03-14 14:43:42,581 | this-app.aux         | DEBUG      | 5 is an int!
2017-03-14 14:43:42,581 | this-app.aux         | INFO       | hello
2017-03-14 14:43:42,581 | this-app             | ERROR      | failed running main

डॉक्स पर अधिक जानकारी यहां: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations


हालाँकि यह 20 वर्णों से ऊपर के तारों को छोटा नहीं करेगा। उपयोग '%(name)20.20s'जो 20 मिनट दोनों और अधिकतम स्ट्रिंग लंबाई के रूप में सेट करता है!
xjcl

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