Sabit genişlikte bir dizi nasıl yazdırılır?


105

Bu koda sahibim (bir dizedeki tüm permütasyonların oluşumunu yazdırmak)

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));

Var olan tüm permütasyon oluşumunu değişken dizgede yazdırmak istiyorum.

permütasyon aynı uzunlukta olmadığından, genişliği sabitlemek ve bunun gibi olmayan güzel bir şekilde yazdırmak istiyorum:

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

Nasıl kullanabilirim format yapmak için ?

Bu gönderileri buldum, ancak alfanümerik dizelerle iyi gitmedi:

python string formatlama sabit genişlik

Python ile sabit uzunluk ayarlama


1
peki ya '% 10s'% 'mystring'
TJD

2
"\t"Herhangi bir çözümde bir seçenek olarak listelenmeyen şaşırttı .

Yanıtlar:


115

DÜZENLEME 2013-12-11 - Bu cevap çok eski. Hala geçerli ve doğrudur, ancak buna bakan kişiler yeni biçim sözdizimini tercih etmelidir .

Dize biçimlendirmesini şu şekilde kullanabilirsiniz :

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

Temel olarak:

  • %karakter bilgilendirir bir belirteç için yedek bir şeye sahip olacaktır python
  • sbelirteci piton karakter bilgilendirir bir dize olacaktır
  • 5pad (ya da dilediğinizi sayı) bilgi verir piton 5 karakter boşluk içeren dize kadar.

Özel durumunuzda, olası bir uygulama şöyle görünebilir:

>>> 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

YAN NOT: itertoolsModülün varlığından haberdar olup olmadığınızı merak ettim . Örneğin, tüm kombinasyonlarınızın bir listesini tek bir satırda şu şekilde elde edebilirsiniz:

>>> [''.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']

ve combinationsile birlikte kullanarak olay sayısını elde edebilirsiniz count().


24
Negatif sayıların sola yaslanmış doldurulmuş çıktı verdiğinden bahsetmelisiniz; bu yeni başlayanlar için pek sezgisel değildir.
üçlü

@Tripleee için +1, negatif sayılarınız olmasaydı sola dayalı yorum yapın Kafamı daha uzun süre vururdum ... thx m8.
Briford Wylie

Bu, yeni str.format'tan çok daha sezgisel ve özlü. Konvolüsyon doğru piton Bu basmalı var neden anlamıyorum
scottmrogowski

Boş alanları belirli bir karakterle doldurmanın bir yolu var mı? Örneğin, "5" yerine "05"
yazmamız

1
Burada, Medium'da f-dizeleriyle zarif sabit genişlikte baskı için birkaç püf noktası var .
pfabri

201

Kullanmayı str.formatçok daha zarif buluyorum :

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

Dizeyi >bunun yerine doğru kullanıma hizalamak istiyorsanız <:

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

Düzenleme: Yorumlarda belirtildiği gibi: 0, argümanın aktarılan dizinini gösterir str.format().


5
Ek olarak, 0, biçim bağımsız değişkeninin konumunu gösterir, böylece iki şey daha yapabilirsiniz: '{<5}'.format('ss') 'ss 'tıpkı daha önce olduğu gibi, ancak 0 olmadan aynı şeyi yapar veya 'Second {1: <5} and first {0: <5}'.format('ss', 'sss') 'Second sss and first ss 'böylece aynı değişkeni tek bir çıktıda birçok kez yeniden sıralayabilir veya hatta çıktı alabilirsiniz. dize.
mightypile

14
İhtiyaç duyduğu önceki yorumu artık düzenleyemiyorum. {<5}çalışmıyor, ancak {: <5}indeks değeri olmadan çalışıyor.
mightypile

9
İşte bu biçim dizelerini ve ek seçenekleri açıklayan Python Biçim Belirtimi Mini Dili . Hızlı referans için uzay {0: <5}olduğu [fill] , <olduğu [align], ve 5olduğunu[width]
cod3monk3y

2
Bu 5 bir değişken ikame olabilir>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
user2763554

4
Ayrıca sayıları kullanabilir ve değişkenleri sırayla listeleyebilirsiniz width=10; "{0: <{1}}".format('sss', width). Ya da sayıları dışarıda bırakın'{: <{}}'.format('sss', width)
joelostblom

74

Başlangıçta @ 0x90'ın cevabında bir düzenleme olarak yayınlandı, ancak gönderinin orijinal amacından saptığı için reddedildi ve bir yorum veya cevap olarak gönderilmesi önerildi, bu yüzden kısa yazıyı buraya ekliyorum.

@ 0x90'dan gelen cevaba ek olarak, sözdizimi genişlik için bir değişken kullanılarak daha esnek hale getirilebilir (@ user2763554'ün yorumuna göre):

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

Ayrıca, bu ifadeyi yalnızca sayıları kullanarak ve şuna iletilen argümanların sırasına güvenerek kısaltabilirsiniz format:

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

Veya maksimum, potansiyel olarak pitonik olmayan örtük, kompaktlık için tüm sayıları dışarıda bırakın:

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

Güncelleme 2017-05-26

İle biçimlendirilmiş dize hazır tanıtımı Python 3.6 (kısaca "f-dizeleri"), bir briefer sözdizimi ile erişim önceden tanımlanmış değişkenlere artık mümkün:

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

Bu aynı zamanda dize biçimlendirmesi için de geçerlidir

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

Bu cevabı en çok beğendim!
Syrtis Major

10

formatkesinlikle en zarif yoldur, ancak afaik ki bunu python loggingmodülüyle kullanamazsınız , bu yüzden %biçimlendirmeyi kullanarak bunu şu şekilde yapabilirsiniz :

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

Burada, -sola hizalamayı belirtir ve önceki sayı ssabit genişliği belirtir.

Bazı örnek çıktılar:

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

Buradaki belgelerde daha fazla bilgi: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations


Ancak bu, 20 karakterin üzerindeki dizeleri kısaltmaz. Kullanım '%(name)20.20s'20 hem minimum ve maksimum dize uzunluğu gibi setleri!
xjcl

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.