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

이 코드가 있습니다 (문자열의 모든 순열 발생 인쇄)

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있습니까?

이 게시물을 찾았지만 영숫자 문자열과 잘 어울리지 않았습니다.

파이썬 문자열 형식 고정 너비

파이썬으로 고정 길이 설정



답변

편집 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()있습니다.


답변

내가 사용 찾을 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().


답변

원래 @ 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       '


답변

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


답변

>>> print(f"{'123':<4}56789")
123 56789


답변