고정 너비로 ​​문자열을 인쇄하는 방법은 무엇입니까?


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

문자열 varaible에있는 모든 순열 발생을 인쇄하고 싶습니다.

순열이 같은 길이가 아니기 때문에 너비를 수정하고 다음과 같이 멋지게 인쇄하고 싶습니다.

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
무엇을 '%의 10 초'% 'mystring에'인쇄에 대한
TJD

2
"\t"어떤 솔루션에서도 옵션으로 나열되지 않은 것에 놀랐습니다 .

답변:


113

편집 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
음수는 왼쪽 정렬 패딩 출력을 제공한다는 점을 언급해야합니다. 초보자에게는 직관적이지 않습니다.
tripleee

@tripleee에 +1, 음수가 없으면 왼쪽 맞춤 주석을 제공합니다. 더 오래 머리를 쳤을 것입니다 ... thx m8.
Briford Wylie

이것은 새로운 str. 형식보다 훨씬 더 직관적이고 간결합니다. 나는 왜 파이썬에서 회선을 향한이 밀어 붙이는 지 이해가 안

공백을 특정 문자로 채우는 방법이 있습니까? 예를 들어, 우리는 대신 "5"의 "05"를 인쇄해야하는 경우
Harshit JINDAL

1
다음은 Medium 에서 f- 문자열로 우아한 고정 너비 인쇄를위한 몇 가지 트릭입니다 .
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 '단일 출력에서 ​​동일한 변수를 여러 번 재정렬하거나 출력 할 수 있습니다. 끈.
mightypile

14
더 이상 필요한 이전 주석을 편집 할 수 없습니다. {<5}작동하지 않지만 {: <5}색인 값없이 작동합니다.
mightypile

9
다음은 이러한 형식 문자열과 추가 옵션을 설명 하는 Python 형식 사양 미니 언어 입니다. 빠른 참고로,의 공간 {0: <5}은 IS [fill] (가), <이다 [align], 그리고 5이다[width]
cod3monk3y

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 업데이트

Python 3.6 에 형식화 된 문자열 리터럴 (줄여서 "f-strings") 이 도입 됨에 따라 이제 더 간단한 구문으로 이전에 정의 된 변수에 액세스 할 수 있습니다.

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

이것은 문자열 형식에도 적용됩니다.

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

이 답변이 정말 마음에 듭니다!
Syrtis Major

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.