백준 코딩 문제를 푸는데 n 줄의 입력을 받을 때 for 문으로 input을 받는 것 말고 다른 방법이 없을까 고민하다가 sys.stdin.readlines() 명령어를 알게 되었다. 이걸 쓰면 사용자가 ^Z(또는 ctrl + z)를 누르기 전까지 입력을 계속할 수 있다. 그런데 파이참에서 실행을 하면 이 키가 먹지 않아서 무한 입력을 해야 하는 상황이 생긴다. 이럴 때는 sys.stdin.readlines() 말고 sys.stdin.readline()을 써서 입력을 원하는 만큼 받을 수 있다. 결국 for문을 써야 하지만 이런 방법도 있다는 것을 알게 되어 좋다. 사실 문제에서는 입력을 받는 게 중요하지 않았지만 그래도 문제를 보면서 여러 가지 상황을 생각해볼 수 있어서 공부하는 데 많은 도움이 되었다.

import sys

def readlines(count):
    result = []
    for i in range(count):
        result.append(*sys.stdin.readline().split())
    return result

print(readlines(3))

그리고 한 줄에 여러 문자를 받아서 각각 넘기고 싶으면 .split()을 사용한다. 괄호 안에 아무것도 쓰지 않으면 공백을 기준으로 값을 나누고, 괄호 안에 문자를 넣으면 그 문자를 기준으로 값을 나눈다.

>>>text = "It's a text, not a code."
>>>result = text.split()
>>>result
["It's", 'a', 'text,', 'not', 'a', 'code.']

>>>result = text.split(",")
>>>result
["It's a text", ' not a code.']

또한 문자 좌우의 공백을 제거하는 메소드도 있다. 오른쪽 공백을 제거하려면 rstrip(), 왼쪽은 lstrip(), 양쪽은 strip()이다.

만약 여러 줄로 값을 받았을 경우 아래와 같이 줄바꿈 문자가 포함된 채로 값을 받는다.

1
2
3
['1\n', '2\n', '3\n']

이 때 sys.stdin.readline().rstrip()이나 sys.stdin.readline().strip()을 사용해서 받으면 공백 문자가 사라진다.

1
2
3
['1', '2', '3']

이걸 만약 ssys.stdin.readline().split()으로 공백을 기준으로 나눠 받으면?

1
2
3
[['1'], ['2'], ['3']]

리스트로 저장되므로 *sys.stdin.readline().split()으로 입력을 풀어서 받아도 되지만 그냥 위의 방법을 쓰는 게 좋다.

 

+덧

 

그리고 input()과 raw_input()이 있다는 걸 알았다. 이전 버전에서는 input()이 raw_input()을 evaluate 한 값이어서 input()의 속도가 느렸고 출력되는 값도 달랐다. 그 때문에 raw_input()이나 sys.stdin 명령어를 쓰는 일이 있었다고 한다. 그런데 내가 쓰는 파이썬 3.7에는 raw_input()이 사라졌고 input()만 있다. input()은 더이상 evaluate를 한 값을 돌려주지 않는다. 이전 버전에서의 raw_input()의 기능을 지금 버전의 input()이 하는 거구나 하고 이해했는데, 맞으려나?

+ Recent posts