출력 문자열 형식, 오른쪽 정렬


149

좌표 x, y, z가 포함 된 텍스트 파일을 처리 중입니다.

     1      128  1298039
123388        0        2
....

모든 라인은 다음을 사용하여 3 개의 항목으로 구분됩니다.

words = line.split()

데이터를 처리 한 후 각 열의 항목이 (입력 파일뿐만 아니라) 올바르게 정렬되도록 다른 txt 파일에 좌표를 다시 작성해야합니다. 모든 선은 좌표로 구성됩니다

line_new = words[0]  + '  ' + words[1]  + '  ' words[2].

std::setw()C ++에는 너비와 정렬을 설정할 수 있는 조작기 등이 있습니까?

답변:


230

최신 str.format구문을 사용하여이 방법을 시도하십시오 .

line_new = '{:>12}  {:>12}  {:>12}'.format(word[0], word[1], word[2])

그리고 다음은 이전 %구문을 사용하여 수행하는 방법입니다 (지원하지 않는 이전 버전의 Python에 유용함 str.format).

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])

39
"이전"구문이 더 깔끔하고 읽기 쉽고 짧습니다.
fyngyrz


48
더 짧게 말해서, 더 깨끗한 것이 무엇을 의미하는지 모르겠지만 '더 읽기 쉽다'는 친숙하기 때문입니다. 아직 그중 하나에 익숙하지 않다면 새로운 형식을 읽기가 더 쉽습니다. 문자열 형식에 대한 ".format"은 확실히 백분율 / 모듈로보다 직관적 인 것 같습니다. 오른쪽 정렬을위한 오른쪽 화살표도 매우 직관적 인 것 같습니다.
Mark

2
@Mark 예전 방식이 더 깔끔한 한 가지 방법은 더 적은 문자를 사용한다는 것입니다. 친숙하게도 새로운 방식은 직관적이지만 더 깨끗하고 단순하지는 않습니다. 예전의 간결하고 정밀한 언어 인 훌륭한 C 언어를 통해 우리에게 오는 구문에 익숙한 사람들에게는 이전 방식이 더 직관적입니다. 새로운 길에는 어떤 선례가 있습니까?
Stephen Boston

2
@StephenBoston 나는 전문가들에게 가독성을 남길 것이지만 새로운 방식은 절대적으로 깨끗합니다. Parens는 더 이상 선택 사항이 아닙니다. %는 수학 연산자와 혼동 될 수 있습니다 (문맥은 아니지만 한 눈에 확인 가능). 단어 [n]이 예상되는 유형이 아닌 경우 (이 경우 문자열) 이전 방식은 실패합니다. 새로운 방식은 들어오는 유형이 무엇인지 알 필요가 없으며 항상 작동합니다. 깨끗하고 간단합니다. 공평하게, 나는 printf 스타일에 익숙해지지 않았습니다 (주로 cout으로 c를했습니다).
Zim

53

다음을 사용하여 달성 할 수 있습니다 rjust.

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)

51

다음과 같이 정렬 할 수 있습니다.

print('{:>8} {:>8} {:>8}'.format(*words))

여기서 >수단 " 오른쪽 정렬 "과 8는 IS 특정 값이.

그리고 여기에 증거가 있습니다 :

>>> for line in [[1, 128, 1298039], [123388, 0, 2]]:
    print('{:>8} {:>8} {:>8}'.format(*line))


       1      128  1298039
  123388        0        2

추신. *lineline목록이 압축 해제 됨을 의미 하므로 다음 .format(*line)과 유사하게 작동합니다 .format(line[0], line[1], line[2])( line3 개의 요소 만있는 목록 이라고 가정 ).



18

다음은 'f-string'형식을 사용하여 형식을 지정할 수있는 다른 방법입니다.

print(
    f"{'Trades:':<15}{cnt:>10}",
    f"\n{'Wins:':<15}{wins:>10}",
    f"\n{'Losses:':<15}{losses:>10}",
    f"\n{'Breakeven:':<15}{evens:>10}",
    f"\n{'Win/Loss Ratio:':<15}{win_r:>10}",
    f"\n{'Mean Win:':<15}{mean_w:>10}",
    f"\n{'Mean Loss:':<15}{mean_l:>10}",
    f"\n{'Mean:':<15}{mean_trd:>10}",
    f"\n{'Std Dev:':<15}{sd:>10}",
    f"\n{'Max Loss:':<15}{max_l:>10}",
    f"\n{'Max Win:':<15}{max_w:>10}",
    f"\n{'Sharpe Ratio:':<15}{sharpe_r:>10}",
)

다음과 같은 출력이 제공됩니다.

Trades:              2304
Wins:                1232
Losses:              1035
Breakeven:             37
Win/Loss Ratio:      1.19
Mean Win:           0.381
Mean Loss:         -0.395
Mean:               0.026
Std Dev:             0.56
Max Loss:          -3.406
Max Win:             4.09
Sharpe Ratio:      0.7395

여기서 당신이하고있는 것은 첫 번째 열의 길이가 15 자이며 왼쪽으로 정렬되고 두 번째 열 (값)은 10 자이며 오른쪽으로 정렬되었다는 것입니다.


형식의 너비를 매개 변수화하는 방법이 있습니까? 이 예에서는 서식을 20 및 15 너비로 변경하기로 결정한 경우 여러 줄을 변경해야합니다. widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",위와 같이 sth를 달성하고 싶습니다.
Tomasz Sabała

1
알았다! 누군가 도움이 될 것입니다. 이를 위해 하나 이상의 중첩 된 괄호가 필요합니다.f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
Tomasz Sabała

1
때로는 가장 좋은 대답은 정확한 질문에 대답하지 않는 것입니다. 감사합니다! :)
Brian Wiley

5

출력의 간단한 표 :

a = 0.3333333
b = 200/3
print("variable a    variable b")
print("%10.2f    %10.2f" % (a, b))

산출:

variable a    variable b
      0.33         66.67

% 10.2f : 10은 최소 길이이고 2는 소수점 이하 자릿수입니다.


1

f- 문자열을 사용하고 후행 자릿수를 제어하여 수행하려면 다음을 수행하십시오.

print(f'A number -> {my_number:>20.5f}')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.