কিভাবে স্থির প্রস্থে একটি স্ট্রিং প্রিন্ট করবেন?


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'% 'মাইস্ট্রিং' প্রিন্ট সম্পর্কে কী
টিজেডি

2
আশ্চর্য যে "\t"কোনও সমাধানের বিকল্প হিসাবে তালিকাভুক্ত নয়।

উত্তর:


112

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, আপনার নেতিবাচক সংখ্যাগুলি ছাড়াই বাম-ন্যায়সঙ্গত মন্তব্য না দিয়ে আমি আমার মাথার উপর আর লম্বা হয়ে থাকতাম ... thx m8।
ব্রিফর্ড ওয়াইলি

এটি নতুন স্ট্রিং ফর্ম্যাটের চেয়ে অনেক বেশি স্বজ্ঞাত এবং সংক্ষিপ্ত। বোঝা যাচ্ছে না কেন অজগরের দিকে ধাক্কা দেওয়ার দিকে ধাবিত হচ্ছে
স্কটমগ্রোগস্কি

একটি নির্দিষ্ট চরিত্রের সাথে ফাঁকা জায়গা পূরণ করার কোনও উপায় আছে কি? উদাহরণস্বরূপ, আমাদের যদি "5" এর পরিবর্তে "05" প্রিন্ট করতে হয়
হর্ষিত জিন্দাল

1
মিডিয়ামে এফ-স্ট্রিং সহ মার্জিত স্থির-প্রস্থের মুদ্রণের জন্য আরও কয়েকটি কৌশল এখানে রইল ।
pfabri

197

আমি 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 'আপনি একই ভেরিয়েবলটিকে একক আউটপুটে বহুবার পুনরায় অর্ডার করতে বা এমনকি আউটপুট দিতে পারেন can স্ট্রিং।
পাওয়ারপাইল

14
আমি আগের মন্তব্যটি আর সম্পাদনা করতে পারি না, যার এটির প্রয়োজন। {<5}কাজ করে না, তবে {: <5}সূচকের মান ব্যতীত কাজ করে।
পাওয়ারপাইল

9
পাইথন ফর্ম্যাট স্পেসিফিকেশন মিনি-ভাষা এই ফর্ম্যাট স্ট্রিং এবং অতিরিক্ত বিকল্পগুলি বর্ণনা করে। দ্রুত অবগতির জন্য, আপনার স্থান {0: <5}হয় [fill] , <হয় [align], এবং 5হয়[width]
cod3monk3y

2
5 টি একটি পরিবর্তনশীল প্রতিস্থাপন হতে পারে>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
ব্যবহারকারী 2763554

4
আপনি সংখ্যাগুলি ব্যবহার করতে পারেন এবং কেবল ক্রম অনুসারে ভেরিয়েবলগুলি তালিকাবদ্ধ করতে পারেন width=10; "{0: <{1}}".format('sss', width)। বা এমনকি সংখ্যাগুলি ছেড়ে দিন'{: <{}}'.format('sss', width)
joelostblom

71

মূলত @ 0x90 এর উত্তরের সম্পাদনা হিসাবে পোস্ট করা হয়েছে তবে এটি পোস্টের মূল অভিপ্রকাশ থেকে বিচ্যুত হওয়ার কারণে প্রত্যাখ্যাত হয়েছে এবং একটি মন্তব্য বা উত্তর হিসাবে পোস্ট করার জন্য প্রস্তাবিত হয়েছে, তাই আমি এখানে সংক্ষিপ্ত লিখন আপকে অন্তর্ভুক্ত করছি।

@ 0x90 এর উত্তর ছাড়াও প্রস্থের জন্য একটি ভেরিয়েবল ব্যবহার করে সিনট্যাক্সটিকে আরও নমনীয় করা যায় (@ ব্যবহারকারী 2763554 এর মন্তব্য অনুসারে):

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

আরও, আপনি কেবল সংখ্যা ব্যবহার করে এবং প্রদত্ত আর্গুমেন্টের ক্রমের উপর নির্ভর করে এই অভিব্যক্তিটিকে প্রশংসনীয় করে তুলতে পারেন format:

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

বা এমনকি সর্বোচ্চ, সম্ভাব্য অ-পাইথোনিকভাবে অন্তর্নিহিত, সংক্ষিপ্ততার জন্য সমস্ত সংখ্যা ছেড়ে দিন:

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

আপডেট 2017-05-26

পাইথন ৩.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- formattting-operation


এটি তবে ২০ টি অক্ষরের উপরে স্ট্রিং সংক্ষিপ্ত করবে না। '%(name)20.20s'কমপক্ষে এবং সর্বোচ্চ স্ট্রিং দৈর্ঘ্যের হিসাবে 20 সেট করে যা ব্যবহার করুন !
xjcl

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.